寻找重复行的索引

81

R语言中的重复行搜索可以通过函数duplicated来实现。如果我们想要删除重复项,只需编写df[!duplicated(df),],就可以从数据框中删除重复项。

但是如何找到重复数据的索引呢?如果duplicated在某一行返回TRUE,则说明这是数据框中此行的第二次出现,其索引可以很容易地获得。如何获取此行第一次出现的索引?换句话说,在哪个索引处与重复的行相同?

我可以在数据框上进行循环,但我认为有一个更优雅的答案。


一种使用dplyr的好方法:https://dev59.com/rV4c5IYBdhLWcg3wLXga#28244567/ - stevec
1
annndrey,为什么你接受了Sven的答案?它完全回答了不同的问题。 - Tomas
1
我无法回答这个问题,但是由于被接受的答案并没有回答这个问题(它返回一个由True/False组成的向量,可以用来对数据框进行子集操作),原问题的一个解决方案是:which(duplicated(df) | duplicated(df, fromLast = TRUE))。然后你就可以得到重复行的索引了。 - OLGJ
2个回答

121

这是一个例子:

df <- data.frame(a = c(1,2,3,4,1,5,6,4,2,1))

duplicated(df) | duplicated(df, fromLast = TRUE)
#[1]  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE

它是如何工作的?

函数duplicated(df)用于确定原始数据中的重复元素。 fromLast = TRUE表示“应从反向考虑重复”。两个逻辑向量通过使用|组合在一起,因为其中至少一个向量中的TRUE表示存在重复值。


10
这完全没有回答问题! - Tomas

20
如果您正在使用 keyed 数据表,那么您可以使用以下简洁的语法。
library(data.table)
DT <- data.table(A = rep(1:3, each=4), 
                 B = rep(1:4, each=3), 
                 C = rep(1:2, 6), key = "A,B,C")

DT[unique(DT[duplicated(DT)]),which=T]

解包

  • DT[duplicated(DT)] 子集选取重复行。

  • unique(...) 返回仅包含重复行唯一组合的结果。这适用于多个重复行的情况(例如三倍重复等)。

  • DT[..., which = T] 将重复行与原始行合并,其中which=T返回行号(如果没有which = T,则仅返回数据)。

您也可以使用

 DT[,count := .N,by = list(A,B,C)][count>1, which=T]

在第二种情况下,无需设置键(并且使用by而不使用键也不会降低效率)。 - pommedeterresautee
1
我非常喜欢这种方法,但是似乎DT[duplicated(DT)]的结果不包括第一行重复的数据,例如如果一个实例有三个重复项,它只会显示其中两个。如何查看所有重复项? - Herman Toothrot
你可以使用fromLast=TRUE的类似方法。就像这样DT[unique(DT[duplicated(DT) | duplicated(DT, fromLast = TRUE)]), which = TRUE] - yuskam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接