为了账号安全,请及时绑定邮箱和手机立即绑定

查找重复行的索引

查找重复行的索引

慕哥9229398 2019-08-12 17:17:34
查找重复行的索引R中复制的函数执行重复行搜索。如果我们想要删除重复项,我们只需要编写df[!duplicated(df),],重复项将从数据框中删除。但是如何找到重复数据的索引呢?如果duplicated在某行上返回TRUE,则意味着这是数据帧中第二次出现这样的行,并且可以很容易地获得其索引。如何获得该行首次出现的索引?或者,换句话说,重复行与之相同的索引?我可以在data.frame上做一个循环,但我认为这个问题有一个更优雅的答案。
查看完整描述

2 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

这将返回逻辑索引向量:

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  TRUEwhich(duplicated(df) | duplicated(df[nrow(df):1, ])[nrow(df):1])#[1]  1  2  4  5  8  9 10

更新(基于注释):
如果fromLast = TRUE用作函数参数,则可以减少命令的复杂性。这比创建两个反向向量更容易。

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

这个怎么运作?

该功能duplicated以相反的行顺序应用于原始数据帧和数据帧。后者的输出再次逆转。请注意,原始数据中第一次出现的重复值是反转版本中的最后一次出现。此后,这两个向量使用组合|由于TRUE它们中的至少一个表示重复的值。


查看完整回答
反对 回复 2019-08-12
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

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


查看完整回答
反对 回复 2019-08-12
  • 2 回答
  • 0 关注
  • 687 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信