查找重复行的索引

R中复制的函数执行重复行search。 如果我们想删除重复项,我们只需要编写df[!duplicated(df),] ,重复项将从数据框中删除。

但是如何find重复数据的索引呢? 如果duplicated在某一行返回TRUE,则意味着这是dataframe中这样一行的第二次发生,并且其索引可以很容易地获得。 如何获得该行第一次出现的索引? 换句话说,一个与重复行相同的索引?

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

这将返回一个逻辑索引向量:

 duplicated(df) | duplicated(df[nrow(df):1, ])[nrow(df):1] 

这是一个例子:

 df <- data.frame(a = c(1,2,3,4,1,5,6,4,2,1)) duplicated(df) | duplicated(df[nrow(df):1, ])[nrow(df):1] #[1] TRUE TRUE FALSE TRUE TRUE FALSE FALSE TRUE TRUE TRUE which(duplicated(df) | duplicated(df[nrow(df):1, ])[nrow(df):1]) #[1] 1 2 4 5 8 9 10 

更新 (基于评论):
如果使用fromLast = TRUE作为函数参数,则可以减less命令的复杂度。 这比创build两个反向vector更容易。

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

怎么运行的?

duplicated的function以相反的行顺序应用于原始dataframe和dataframe。 后者的输出又被颠倒了。 请注意,原始数据中首次出现的重复值是反转版本中的最后一次出现。 之后,两个vector都使用|进行组合 因为其中至less有一个值为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(...)只返回重复行的唯一组合。 这涉及任何情况下超过1重复(重复副本,例如一式三份等)

  • DT[..., which = T]合并重复的行与原始的, which=T返回行号(没有which = T它只会返回数据)。

你也可以使用

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