78

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

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

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

4

2 回答 2

115

这是一个例子:

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其中至少一个中的 a 表示重复值,因此使用组合两个结果逻辑向量。

于 2012-09-19T13:13:23.797 回答
20

如果您使用的是带键的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]
于 2012-09-24T00:20:22.343 回答