R语言中的重复行搜索可以通过函数duplicated来实现。如果我们想要删除重复项,只需编写df[!duplicated(df),]
,就可以从数据框中删除重复项。
但是如何找到重复数据的索引呢?如果duplicated
在某一行返回TRUE,则说明这是数据框中此行的第二次出现,其索引可以很容易地获得。如何获取此行第一次出现的索引?换句话说,在哪个索引处与重复的行相同?
我可以在数据框上进行循环,但我认为有一个更优雅的答案。
R语言中的重复行搜索可以通过函数duplicated来实现。如果我们想要删除重复项,只需编写df[!duplicated(df),]
,就可以从数据框中删除重复项。
但是如何找到重复数据的索引呢?如果duplicated
在某一行返回TRUE,则说明这是数据框中此行的第二次出现,其索引可以很容易地获得。如何获取此行第一次出现的索引?换句话说,在哪个索引处与重复的行相同?
我可以在数据框上进行循环,但我认为有一个更优雅的答案。
这是一个例子:
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
表示存在重复值。
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(...)
返回仅包含重复行唯一组合的结果。这适用于多个重复行的情况(例如三倍重复等)。
DT[..., which = T]
将重复行与原始行合并,其中which=T
返回行号(如果没有which = T
,则仅返回数据)。
您也可以使用
DT[,count := .N,by = list(A,B,C)][count>1, which=T]
fromLast=TRUE
的类似方法。就像这样DT[unique(DT[duplicated(DT) | duplicated(DT, fromLast = TRUE)]), which = TRUE]
。 - yuskam
which(duplicated(df) | duplicated(df, fromLast = TRUE))
。然后你就可以得到重复行的索引了。 - OLGJ