查找重复行的索引
R中复制的函数执行重复行search。 如果我们想删除重复项,我们只需要编写df[!duplicated(df),]
,重复项将从数据框中删除。
但是如何find重复数据的索引呢? 如果duplicated
在某一行返回TRUE,则意味着这是dataframe中这样一行的第二次发生,并且其索引可以很容易地获得。 如何获得该行第一次出现的索引? 换句话说,一个与重复行相同的索引?
我可以在data.frame上做一个循环,但是我认为在这个问题上有一个更优雅的答案。
这将返回一个逻辑索引向量:
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 TRUE which(duplicated(df) | duplicated(df[nrow(df):1, ])[nrow(df):1]) #[1] 1 2 4 5 8 9 10
更新 (基于评论):
如果使用fromLast = TRUE
作为函数参数,则可以减less命令的复杂度。 这比创build两个反向vector更容易。
duplicated(df) | duplicated(df, fromLast = TRUE) duplicated(df) | duplicated(df, fromLast = TRUE) #[1] TRUE TRUE FALSE TRUE TRUE FALSE FALSE TRUE TRUE TRUE
怎么运行的?
duplicated
的function以相反的行顺序应用于原始dataframe和dataframe。 后者的输出又被颠倒了。 请注意,原始数据中首次出现的重复值是反转版本中的最后一次出现。 之后,两个vector都使用|
进行组合 因为其中至less有一个值为TRUE
表示重复的值。
如果您使用的是键控的 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]