2011-10-03 26 views
4

我試圖找到一個函數來匹配一個公共列上不同長度的兩個數據幀,並創建一個不同的列,指定它是否找到是否匹配。 因此,例如, DF1是:在R中合併兩個數據幀並找到公用值和不匹配的值

Name Position location 
francesca A 75 
cristina B 36 

而且DF2是:

location Country 
75 UK 
56 Austria 

而且我想匹配的 「位置」 和輸出是這樣的:

Name Position Location Match 
francesca A 75 1 
cristina B 36 0 

我嘗試過使用功能match或使用:

subset(df1, location %in% df2) 

但它不起作用。

請你幫我弄清楚如何做到這一點?

回答

8

嘗試:

df1$match <- match(df1$location, df2$location, nomatch=0) 

這將增加一欄,DF1指示哪些行DF2與它匹配(如指定只考慮位置)。如果沒有匹配,將返回零,這樣就可以獲得:

> df1 
     Name Position location match 
1 francesca  A  75  1 
2 cristina  B  36  0 

一個警告:如果在第二個表多場比賽,你想使用一個不同的方法,因爲這種方法只返回第一場比賽。我認爲這些都是獨特的,因爲你指定了你的問題,所以這不應該成爲一個問題。

+0

傑森B,非常感謝。通過這種方式,我可以獲得在兩個dfs中匹配的記錄列表(如果匹配> 0)以及僅在df1(match == 0)中存在的記錄列表。還有一個問題,你知道是否有一種簡單的方法來獲得df2中不在df1中的記錄列表?謝謝 – user971102

+0

Hi @ user971102 - 很高興它爲你工作(如果答案解決了你的問題,請接受它,讓其他人知道)。要從df2獲取不在df1中的記錄,請嘗試:df2 [which(is.na(match(df2 $ location,df1 $ location))),]]或者,更直觀地說,df2 [-which(df2 $ location%在%df1 $位置),] –

+0

對不起傑森B,只是最後一個澄清......正如你所說,如果這些值不是唯一的,這種方法將不起作用,我在開始時有一個額外的步驟,以確保只有一個「位置」記錄:df1_unique <-subset(df1,!duplicated(location)),用於df1和df2。但是,這不應該意味着「匹配」列應該只有0或1個值嗎?但我的'匹配'值不僅是= 1或0 ... – user971102