基于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 中保持具有最大值的行

如何使用 VBA 在 Excel 宏中删除具有两列的重复项?

删除基于重复的两列值。

awk 根据两列和自定义重复规则删除重复项

合并多个 CSV 文件并删除 R 中的重复项