只选择df1行的简单方法,其中df2中存在列组合(不加入df1,df2)

时间:2016-02-11 13:43:20

标签: r

想象一下,我有两个数据框,有两个或三个常见变量,但还有更多不同的变量:

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的行,其中ab的值的组合至少存在于df2的一行中,而不关心大约c(剩余的公共专栏)。如果我使用

merge(df1,df2,by=c("a","b"))

选择了正确的行,但是...... df2的所有列都添加到df1。那不是我想要的。在实际情况中,df2df1每个可以有大约1000列,其名称可以在运行时更改,并且最多2或3列具有相同的名称。因此,我应该找到一种自动,适应性强的方法来删除少于1000列,这些列位于df2但不在df1中。这似乎缓慢而复杂(另外,我不知道我怎么能这样做)。是不是有一个更简单的解决方案,不会将额外的列添加到df1

1 个答案:

答案 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