删除 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
我有一个数据框,例如
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