想象一下,我有两个数据框,有两个或三个常见变量,但还有更多不同的变量:
df1=data.frame(a=rep(c(3000,4000,5000),each=4),b=c(50,60),c=1,as.list(colnames(mtcars)))
df2=data.frame(a=c(3000,4000),b=60,c=c(1,2),as.list(LETTERS))
我想只选择df1
的行,其中a
和b
的值的组合至少存在于df2
的一行中,而不关心大约c
(剩余的公共专栏)。如果我使用
merge(df1,df2,by=c("a","b"))
选择了正确的行,但是...... df2
的所有列都添加到df1
。那不是我想要的。在实际情况中,df2
和df1
每个可以有大约1000列,其名称可以在运行时更改,并且最多2或3列具有相同的名称。因此,我应该找到一种自动,适应性强的方法来删除少于1000列,这些列位于df2
但不在df1
中。这似乎缓慢而复杂(另外,我不知道我怎么能这样做)。是不是有一个更简单的解决方案,不会将额外的列添加到df1
?
答案 0 :(得分:2)
或者,您也可以使用semi_join
dplyr
library(dplyr)
semi_join(df1, df2, by = c("a", "b"))
# a b c X.mpg. X.cyl. X.disp. X.hp. X.drat. X.wt. X.qsec. X.vs. X.am. X.gear. X.carb.
#1 3000 60 1 mpg cyl disp hp drat wt qsec vs am gear carb
#2 3000 60 1 mpg cyl disp hp drat wt qsec vs am gear carb
#3 4000 60 1 mpg cyl disp hp drat wt qsec vs am gear carb
#4 4000 60 1 mpg cyl disp hp drat wt qsec vs am gear carb