2016-10-17 42 views
0

這是而不是重複問題至How to join (merge) data frames。您可以在組內執行left.merge,但不能執行整個數據集。這個ID是內部的組,而不是 acroos組。 通過不分組和使用left.merge,你會搞砸了數據按組合並按公用ID合併數據(組外複製ID)

我有很多組數據(面板數據/時間系列)。 組中,我想通過一個公共ID合併數據。並將所有的組合應用於相同的合併(對於所有其他組),相同的merge

#sample data 
a<-data.frame(c(1:4,1:4),1,c('a','a','a','a','b','b','b','b')) 
b<-data.frame(c(2,4,2,4),10,c('a','a','b','b')) 

colnames(a)<-c('id','v','group') 
colnames(b)<-c('id','v1','group') 

> a 
    id v group 
1 1 1  a 
2 2 1  a 
3 3 1  a 
4 4 1  a 
5 1 1  b 
6 2 1  b 
7 3 1  b 
8 4 1  b 
> b 
    id v1 group 
1 2 10  a 
2 4 10  a 
3 2 10  b 
4 4 10  b 

我試圖用dplyr group_by (group),然後merge(a,b,by='id',all.x=TRUE),但不知道如何申請dplyr兩個數據集

所需的輸出(左合併)

id v group.x v1 group.y 
    1 1  a NA <NA> 
    2 1  a 10  a 
    3 1  a NA <NA> 
    4 1  a 10  a 
    1 1  b NA <NA> 
    2 1  b 10  b 
    3 1  b NA <NA> 
    4 1  b 10  b 
+0

在dplyr之外,您可以選擇'library(data.table); setDT(b)[a,on =「id」,mult =「first」]' – Frank

+3

'a%>%left_join(b,by = c(「id」,「group」))'。這給你只有一個「組」列,但對於'b'中沒有匹配行的情況,'v1'將是'NA',因此創建兩個單獨的「組」列是多餘的。考慮到'group'(大概)表示兩個數據幀中數據的相同底層劃分,情況會不會更好? – eipi10

+0

我認爲你必須舉一個涵蓋這種情況的例子。無論如何,我不清楚你描述的是什麼擴展。 – Frank

回答

2

你可以只包括groupby參數加入:

a %>% left_join(b, by=c("id","group")) 
id v group v1 
1 1 1  a NA 
2 2 1  a 10 
3 3 1  a NA 
4 4 1  a 10 
5 1 1  b NA 
6 2 1  b 10 
7 3 1  b NA 
8 4 1  b 10 

這使您只有一個「組」列,但v1NA的情況下,有一個在b沒有匹配行,因此創建兩個單獨的「組」列是多餘的。考慮到該組(假定)代表了兩個數據框中的數據的相同的基本劃分,情況會不會更好?

+0

你的代碼工作。它假設'組''ID'的組合是唯一的,對嗎?如果'group'中的一小部分'id'不是唯一的,那該怎麼辦? – alphabetagamma

+0

你的意思是說,可以有多個具有'id'和'group'組合的行(但大概是不同的'v'值)?正如@弗蘭克所說,請提供你想要的更多細節;最好通過添加示例數據/代碼到您的問題。 – eipi10