数据框中的行,在某些列中具有重复值

时间:2015-10-13 12:07:00

标签: r dataframe

假设数据帧df有5列a1到a5。我想要那些在a1和a2列中具有共同值的df行。

 col=c("a1","a2" )
 df1=df[,which(colnames(df)%in%col)]
 l=which(duplicated(df1)==TRUE)
 df2=df[l, ]

现在df2只包含重复的行。我想添加具有重复值的匹配行。

样品

  a1=c(1:3,3,4)
  a2=c("a1","a2","a2","a2","a1")
  a3=c(1:5)
  df=data.frame(a1,a2,a3)
  df
   a1 a2 a3
 1  1 a1  1
 2  2 a2  2
 3  3 a2  3
 4  3 a2  4
 5  4 a1  5
  col1=c("a1","a2" )
  df1=df[,which(colnames(df)%in%col1)]
  l=which(duplicated(df1)==TRUE)
  df2=df[l, ]
  df2
   a1 a2 a3
 4  3 a2  4

但我希望df2成为

   a1 a2 a3
 3  3 a2  3
 4  3 a2  4

一种解决方案是在df中搜索..但我的df有大约10M行...所以这个解决方案很有效

2 个答案:

答案 0 :(得分:1)

尝试代替

 l=which(duplicated(df1)==TRUE)

使用

l=which(duplicated(df1) | duplicated(df1,fromLast = T))

应该适合你

答案 1 :(得分:0)

您也可以尝试使用此data.table解决方案来提高速度。我认为使用密钥可能会更快,具体取决于您的表大小与密钥的开销:

library(data.table)

dt <- data.table(a1,a2,a3)

setkey(dt, a1, a2)

dups <- which(duplicated(dt))

dt[dt[dups, list(a1, a2)]]

修改:请参阅下面的Arun评论专家data.table