猿问

查找重复行的索引

查找重复行的索引

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

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

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


慕哥9229398
浏览 688回答 2
2回答

忽然笑

这将返回逻辑索引向量:duplicated(df)&nbsp;|&nbsp;duplicated(df[nrow(df):1,&nbsp;])[nrow(df):1]这是一个例子:df&nbsp;<-&nbsp;data.frame(a&nbsp;=&nbsp;c(1,2,3,4,1,5,6,4,2,1))duplicated(df)&nbsp;|&nbsp;duplicated(df[nrow(df):1,&nbsp;])[nrow(df):1]#[1]&nbsp;&nbsp;TRUE&nbsp;&nbsp;TRUE&nbsp;FALSE&nbsp;&nbsp;TRUE&nbsp;&nbsp;TRUE&nbsp;FALSE&nbsp;FALSE&nbsp;&nbsp;TRUE&nbsp;&nbsp;TRUE&nbsp;&nbsp;TRUEwhich(duplicated(df)&nbsp;|&nbsp;duplicated(df[nrow(df):1,&nbsp;])[nrow(df):1])#[1]&nbsp;&nbsp;1&nbsp;&nbsp;2&nbsp;&nbsp;4&nbsp;&nbsp;5&nbsp;&nbsp;8&nbsp;&nbsp;9&nbsp;10更新(基于注释):如果fromLast = TRUE用作函数参数,则可以减少命令的复杂性。这比创建两个反向向量更容易。duplicated(df)&nbsp;|&nbsp;duplicated(df,&nbsp;fromLast&nbsp;=&nbsp;TRUE)duplicated(df)&nbsp;|&nbsp;duplicated(df,&nbsp;fromLast&nbsp;=&nbsp;TRUE)#[1]&nbsp;&nbsp;TRUE&nbsp;&nbsp;TRUE&nbsp;FALSE&nbsp;&nbsp;TRUE&nbsp;&nbsp;TRUE&nbsp;FALSE&nbsp;FALSE&nbsp;&nbsp;TRUE&nbsp;&nbsp;TRUE&nbsp;&nbsp;TRUE这个怎么运作?该功能duplicated以相反的行顺序应用于原始数据帧和数据帧。后者的输出再次逆转。请注意,原始数据中第一次出现的重复值是反转版本中的最后一次出现。此后,这两个向量使用组合|由于TRUE它们中的至少一个表示重复的值。

喵喵时光机

如果您使用的是键控&nbsp;data.table,则可以使用以下优雅语法library(data.table)DT&nbsp;<-&nbsp;data.table(A&nbsp;=&nbsp;rep(1:3,&nbsp;each=4),&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B&nbsp;=&nbsp;rep(1:4,&nbsp;each=3),&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C&nbsp;=&nbsp;rep(1:2,&nbsp;6),&nbsp;key&nbsp;=&nbsp;"A,B,C")DT[unique(DT[duplicated(DT)]),which=T]打开包装DT[duplicated(DT)]&nbsp;子集那些重复的行。unique(...)仅返回重复行的唯一组合。这涉及任何重复超过1的案例(重复重复,例如重复等)DT[..., which = T]&nbsp;将重复的行与原始行合并,并which=T返回行号(没有which = T它只会返回数据)。你也可以用&nbsp;DT[,count&nbsp;:=&nbsp;.N,by&nbsp;=&nbsp;list(A,B,C)][count>1,&nbsp;which=T]
随时随地看视频慕课网APP
我要回答