基于R中的两列删除重复项[重复]
Posted
技术标签:
【中文标题】基于R中的两列删除重复项[重复]【英文标题】:Removing duplicates based on two columns in R [duplicate] 【发布时间】:2015-07-29 21:57:51 【问题描述】:假设我的数据如下,
X Y
26 14
26 14
26 15
26 15
27 15
27 15
28 16
28 16
我想删除重复的行。我可以通过此命令删除基于一列的重复行,
dat[c(T, diff(dat$X) != 0), ] or dat[c(T, diff(dat$Y) != 0), ]
但我只想在两列具有相同的先前值时删除重复项。我不能在这里使用唯一的,因为稍后会出现相同的数据。我想检查之前的值并计算它
我的示例输出是,
x y
26 14
26 15
27 15
28 16
我们如何在 R 中做到这一点?
谢谢
伊贾兹
【问题讨论】:
或许dat[Reduce("|",lapply(dat, function(x) c(T, diff(x)!=0))),]
已经有一个用于数据帧的duplicated
方法。 dat[!duplicated(dat),]
您可以试试Reduce
选项。你提到的其他方法不起作用。最好生成一个不适用于发布的方法的示例。
你选择了一个不好的例子,IIUC。
@Observer 您可以对列进行子集化以检查重复项!duplicated(dat[1:2])
【参考方案1】:
使用data.table v1.9.5
- 安装说明here:
require(data.table) # v1.9.5+
df[!duplicated(rleidv(df, cols = c("X", "Y"))), ]
rleidv()
最好通过例子来理解:
rleidv(c(1,1,1,2,2,3,1,1))
# [1] 1 1 1 2 2 3 4 4
为每个连续运行的值生成一个唯一索引。
同样可以在一组特定列上的list()
或data.frame()
或data.table()
上完成。例如:
df = data.frame(a = c(1,1,2,2,1), b = c(2,3,4,4,2))
rleidv(df) # computes on both columns 'a,b'
# [1] 1 2 3 3 4
rleidv(df, cols = "a") # only looks at 'a'
# [1] 1 1 2 2 3
其余的应该是相当明显的。我们只检查duplicated()
值,并返回非重复值。
【讨论】:
【参考方案2】:使用dplyr
:
library(dplyr)
z %>% filter(X != lag(X) | Y != lag(Y) | row_number() == 1)
我们需要包含row_number()==1
否则我们会丢失第一行
【讨论】:
以上是关于基于R中的两列删除重复项[重复]的主要内容,如果未能解决你的问题,请参考以下文章
使用 R 如何删除基于多列的重复项,但选择重复项的“最完整”版本
从数据框中删除重复项,基于两列 A,B,在另一列 C 中保持具有最大值的行