我需要根据给定列中的值的重复性从数据框中删除行,但仅限于连续重复的行。 例如,对于以下数据框:
df = data.frame(x=c(1,1,1,2,2,4,2,2,1))
df$y <- c(10,11,30,12,49,13,12,49,30)
df$z <- c(1,2,3,4,5,6,7,8,9)
x y z
1 10 1
1 11 2
1 30 3
2 12 4
2 49 5
4 13 6
2 12 7
2 49 8
1 30 9
我需要删除x列中连续重复的行,保留最后一个重复的行,并保持数据框的结构:
x y z
1 30 3
2 49 5
4 13 6
2 49 8
1 30 9
根据help
和其他帖子的指示,我尝试使用duplicated
函数:
df[ !duplicated(x,fromLast=TRUE), ] # which gives me this:
x y z
1 1 10 1
6 4 13 6
7 2 12 7
9 1 30 9
NA NA NA NA
NA.1 NA NA NA
NA.2 NA NA NA
NA.3 NA NA NA
NA.4 NA NA NA
NA.5 NA NA NA
NA.6 NA NA NA
NA.7 NA NA NA
NA.8 NA NA NA
不确定为什么会在末尾出现NA行(之前测试类似的表格并没有发生),但是对于数值只部分起作用。
我还尝试了使用 data.table 包,如下所示:
library(data.table)
dt <- as.data.table(df)
setkey(dt, x)
dt[J(unique(x)), mult ='last']
功能很棒,但它会从数据框中删除所有重复项,而不仅仅是连续的重复项,得到的结果类似于:
x y z
1 30 9
2 49 8
4 13 6
请谅解如果发重复帖子。我尝试了一些建议,但没有一个能够仅消除连续的内容。
非常感谢任何帮助。
inx <- with(df, c(FALSE, diff(x) != 0)); df[c(diff(cumsum(inx)) != 0, TRUE), ]
。(我不确定我喜欢它,diff
太多了。) - Rui Barradasc(FALSE, diff(x) !=0)
是什么意思?抱歉,我是新手,正在努力学习。如果您没有时间详细解释也没关系。谢谢。 - ebb