查找重复行的索引 [重复]

Posted

技术标签:

【中文标题】查找重复行的索引 [重复]【英文标题】:Find indices of duplicated rows [duplicate] 【发布时间】:2012-09-11 19:11:07 【问题描述】:

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

但是如何找到重复数据的索引呢?如果duplicated 在某行返回TRUE,则表示这是该行在数据框中的第二次出现,并且可以轻松获得其索引。如何获取该行第一次出现的索引?或者,换句话说,与重复行相同的索引?

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

【问题讨论】:

使用 dplyr 的好方法:***.com/a/28244567 annndrey,你为什么接受斯文的回答?它回答了完全不同的问题。 【参考方案1】:

这是一个例子:

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 表示重复值。

【讨论】:

这根本不能回答问题!【参考方案2】:

如果您使用的是 keyed 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]

【讨论】:

在第二种情况下,无需设置密钥(并且在没有密钥的情况下 by 效率不低)。 我真的很喜欢这种方法,但似乎 DT[duplicated(DT)] 的结果不包括重复的第一行,例如,如果我有一个实例的三个重复项,它将只给我看其中两个。如何全部查看? 您可以使用与fromLast=TRUE 类似的方法。类似DT[unique(DT[duplicated(DT) | duplicated(DT, fromLast = TRUE)]), which = TRUE]

以上是关于查找重复行的索引 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在拆分为多个文件的大型数据框中查找重复行和包含重复行的文件

PySpark - 获取重复行的索引

在具有重复行的 SQL Server 表中按组查找行号

Matlab:分配给具有列\行索引对的矩阵[重复]

sublime 去除重复行或者只保留唯一值

从 TypeScript 中的行 ID 获取表行索引 [重复]