2015-02-23 92 views
5

我想合併2 df的在df1中包含2列和df2 1列,在這種情況下如何應用函數合併?如何合併1列上的2列

下面是示例情況:

df1 <- data.frame(var1=letters[1:5],var2=letters[6:10]) 
df2 <- data.frame(var3=letters[1:10]) 

假的嘗試:

merge(df1,df2,by.x=c("var1","var2"),by.y="var3",all.y=TRUE) 

如何使匹配的搜索使用DF1的兩列(VAR1 & VAR2),並運行在合併這兩個DF的df2(var3)?

希望的輸出:

var1 var2 var3 
1  a f  a 
2  b g  b 
3  c h  c 
4  d i  d 
5  e j  e 
6  <NA> <NA> f 
7  <NA> <NA> g 
8  <NA> <NA> h 
9  <NA> <NA> i 
10 <NA> <NA> j 

編輯:改進的數據(希望):

df1 <- data.frame(var1=c(letters[1:5],rep("x",5)),var2=c(letters[6:10],rep("x",5))) 
df2 <- data.frame(var3=letters[1:10]) 

希望的輸出:

 var1 var2 var3 
1  a f  a 
2  b g  b 
3  c h  c 
4  d i  d 
5  e j  e 
6  x x  f 
7  x x  g 
8  x x  h 
9  x x  i 
10  x x  j 
+0

'merge'兩次可能會是一種可能的解決方案 – Metrics 2015-02-23 15:28:33

+0

是的,我想過,但可能會混淆我的真實數據。 – Maximilian 2015-02-23 15:30:10

+0

通過凌亂,我的意思是搞亂了數據:)我認爲,這可能是相當容易出錯 – Maximilian 2015-02-23 15:43:55

回答

5

您可以使用merge用爭論by='row.names'sort=F(由馬修Plourde指出)不讓merge亂了順序:

> merge(df1, df2, by='row.names', sort=FALSE, all=TRUE)[c("var1", "var2", "var3")] 
    var1 var2 var3 
1  a f a 
2  b g b 
3  c h c 
4  d i d 
5  e j e 
6 <NA> <NA> i 
7 <NA> <NA> f 
8 <NA> <NA> g 
9 <NA> <NA> h 
10 <NA> <NA> j 
+1

永遠不會想到'by = 0'。給'合併''sort = FALSE'參數可以讓你完整。 – 2015-02-23 16:07:05

+1

您應該明確說明這是加入行名稱。 – 2015-02-23 16:13:18

5

這裏的一個可能data.table溶液按照第一期望的輸出

library(data.table) 
setkey(setDT(df2), var3) 
df2[df1, `:=`(var1 = i.var1, var2 = i.var2)][] 
#  var3 var1 var2 
# 1: a a f 
# 2: b b g 
# 3: c c h 
# 4: d d i 
# 5: e e j 
# 6: f NA NA 
# 7: g NA NA 
# 8: h NA NA 
# 9: i NA NA 
# 10: j NA NA 
+0

我正在研究相同的解決方案。但是,你很快:-) – akrun 2015-02-23 15:39:28

+0

看起來像@ user1981275制定了更通用的解決方案 – 2015-02-23 15:40:17

+0

是的,這是非常有創意的。從來沒有想過'by = 0'(可能以前看過,不記得) – akrun 2015-02-23 15:41:17

5

你真的只需要根據df1cbind重新排序df2他們:

cbind(df1, df2[order(match(df2$var3, df1$var1)),, drop=FALSE]) 

如果df2有多個列,則不需要drop=FALSE

# var1 var2 var3 
# 1  a f a 
# 2  b g b 
# 3  c h c 
# 4  d i d 
# 5  e j e 
# 6  x x f 
# 7  x x g 
# 8  x x h 
# 9  x x i 
# 10 x x j 

這種方法保持一致,對於沒有XS第一個數據集,你可以使用:

cbind(lapply(df1, `length<-`, nrow(df2)), df2[order(match(df2$var3, df1$var1)),, drop=FALSE]) 

# var1 var2 var3 
# 1  a f a 
# 2  b g b 
# 3  c h c 
# 4  d i d 
# 5  e j e 
# 6 <NA> <NA> f 
# 7 <NA> <NA> g 
# 8 <NA> <NA> h 
# 9 <NA> <NA> i 
# 10 <NA> <NA> j 

或者在一個更可讀的方式:

df1 <- lapply(df1, `length<-`, nrow(df2)) 
df2 <- df2[order(match(df2$var3, df1$var1)),, drop=FALSE] 
cbind(df1, df2) 
+0

爲第二個數據集('x'),爲什麼不只是'cbind(df1,df2)'? – user1981275 2015-02-23 15:50:23

+0

假定'df2'已經是有序的,這是OP樣本數據的一個屬性,但我想象的不是他真實數據的一般屬性。 – 2015-02-23 15:51:41