我有一个数据报,例如
COL1 COL2 COL3
G1 1 6
G1 2 6
G1 3 7
G1 4 9
G1 5 9
G1 6 9
G1 7 6
G1 8 6
G1 9 7
G1 10 7
G1 11 7
G1 12 8
G1 13 7我希望删除重复的连续COL3值,并保留第一个。
在这里,我应该得到:
COL1 COL2 COL3
G1 1 6
G1 3 7
G1 4 9
G1 7 6
G1 9 7
G1 12 8
G1 13 7以下是dput格式(如果可以的话):
structure(list(COL1 = c("G1", "G1", "G1", "G1", "G1", "G1", "G1",
"G1", "G1", "G1", "G1", "G1", "G1"), COL2 = 1:13, COL3 = c(6L,
6L, 7L, 9L, 9L, 9L, 6L, 6L, 7L, 7L, 7L, 8L, 7L)), class = "data.frame", row.names = c(NA,
-13L))发布于 2022-04-29 09:06:03
在基R中,可以使用游程编码(rle):
df[nrow(df) - rev(cumsum(rle(rev(df$COL3))$lengths) - 1),]
#> COL1 COL2 COL3
#> 1 G1 1 6
#> 3 G1 3 7
#> 4 G1 4 9
#> 7 G1 7 6
#> 9 G1 9 7
#> 12 G1 12 8
#> 13 G1 13 7或rleid来自data.table
df[c(TRUE, diff(data.table::rleid(df$COL3)) == 1),]
#> COL1 COL2 COL3
#> 1 G1 1 6
#> 3 G1 3 7
#> 4 G1 4 9
#> 7 G1 7 6
#> 9 G1 9 7
#> 12 G1 12 8
#> 13 G1 13 7或者只保留与自己的滞后不匹配的行:
df[df$COL3 != dplyr::lag(df$COL3, default = pi),]
#> COL1 COL2 COL3
#> 1 G1 1 6
#> 3 G1 3 7
#> 4 G1 4 9
#> 7 G1 7 6
#> 9 G1 9 7
#> 12 G1 12 8
#> 13 G1 13 7发布于 2022-04-29 09:07:58
基于dplyr的另一种可能的解决方案
library(dplyr)
df %>%
filter(COL3 != lead(COL3, default = Inf))
#> COL1 COL2 COL3
#> 1 G1 2 6
#> 2 G1 3 7
#> 3 G1 6 9
#> 4 G1 8 6
#> 5 G1 11 7
#> 6 G1 12 8
#> 7 G1 13 7发布于 2022-04-29 09:19:09
使用data.table,
temp[COL3!=lag(COL3,default = 0)]输出
COL1 COL2 COL3
1: G1 1 6
2: G1 3 7
3: G1 4 9
4: G1 7 6
5: G1 9 7
6: G1 12 8
7: G1 13 7https://stackoverflow.com/questions/72055382
复制相似问题