忽然笑
这将返回逻辑索引向量: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它们中的至少一个表示重复的值。
喵喵时光机
如果您使用的是键控 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]