查找重复行的索引

在 R 中复制的函数执行重复的行搜索。如果我们想删除重复,我们只需要写 df[!duplicated(df),]和重复将从数据帧删除。

但是如何找到重复数据的索引呢?如果 duplicated在某一行上返回 TRUE,这意味着这是数据帧中第二次出现这样的行,并且可以很容易地获得它的索引。如何获得此行的首次出现的索引?或者,换句话说,与重复行相同的索引?

我可以在 data.frame 上做一个循环,但我认为这个问题有一个更优雅的答案。

121185 次浏览

这里有一个例子:

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表示重复值,因此使用 |组合得到的两个逻辑向量。

如果使用的是 有钥匙 data.table,那么可以使用以下优雅的语法

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]