如果我有2个数据框,请说
df1 = data.frame(A = c(10,20,30,20,10),B = c("a","b","c","b","a"))
df2 = data.frame(A = c(10,30),B = c("a","c"))
现在我希望df1中的所有行都与df2的行匹配。在这里,答案应该是:
>dfout
A B
1 10 a
2 30 c
3 10 a
如果我使用:
sqldf("select * from df1 intersect select * from df2")
我明白了:
>output
A B
1 10 a
2 30 c
但我想要所有匹配的行,包括重复行。
注意:我请求的解决方案应该是通用解决方案,不要在任何地方使用列名。
答案 0 :(得分:5)
merge
似乎是这份工作的人:
merge(df1, df2)
## A B
## 1 10 a
## 2 10 a
## 3 30 c
或者,来自inner_join
的{{1}}:
dplyr
答案 1 :(得分:3)
这可以使用sqldf的默认后端(sqlite)使用自然连接来完成:
sqldf("SELECT * FROM df1 NATURAL JOIN df2")
自然连接将根据具有相同名称的所有列之间的相等条件在两个表(数据框)之间执行内部连接。
注意:也可以将 INTERSECT ALL 与RPostgreSQL后端一起用于sqldf。
答案 2 :(得分:3)
我们可以使用data.table
library(data.table)
setDT(df1)[df2, on=names(df1)]
# A B
#1: 10 a
#2: 10 a
#3: 30 c