删除 R 中数据框中连续值之间的重复项

Remove duplicate among consecutive values within a dataframe in R

我有一个数据框,例如

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))

在 base R 中,您可以使用 run-length 编码 (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

另一种可能的解决方案,基于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

使用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    7