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