假设数据帧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行...所以这个解决方案很有效
答案 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