2016-01-13 95 views
0

行。如果我有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 

但我希望所有的匹配行,包括重複的。

注:我請求的解決方案應該是一個通用的解決方案,不需要在任何地方使用列名。

回答

5

merge似乎是這個職位的人:

merge(df1, df2) 

## A B 
## 1 10 a 
## 2 10 a 
## 3 30 c 

另外,inner_joindplyr

library(dplyr) 
inner_join(df1, df2) 

## Joining by: c("A", "B") 
## A B 
## 1 10 a 
## 2 30 c 
## 3 10 a 
## Warning message: 
## In inner_join_impl(x, y, by$x, by$y) : 
## joining factors with different levels, coercing to character vector 
3

這可以通過使用默認的後端(SQLite的)自然連接來完成sqldf:

sqldf("SELECT * FROM df1 NATURAL JOIN df2") 

自然連接將p根據所有具有相同名稱的列之間的相等條件,在兩個表(數據框)之間執行內部連接。

注:這也將有可能使用INTERSECT ALL與RPostgreSQL後端sqldf。

+0

sqldf支持4個不同的後端。 –

+0

確實如此,但默認情況下它使用sqlite。另外,幾乎所有其他的都必須單獨安裝。我將編輯帖子以提及這一點,但假設OP使用默認設置可能是安全的。另外,據我所知,後端都不支持PostgreSQL之外的** INTERSECT ALL **。 – Matthew

+0

我已經更積極地重寫了它。 –

3

我們可以使用data.table

library(data.table) 
setDT(df1)[df2, on=names(df1)] 
# A B 
#1: 10 a 
#2: 10 a 
#3: 30 c 
相關問題