2012-07-06 33 views
2

我發現自己在R中多次進行「有條件的左連接」。如果你有兩個數據幀,諸如:你如何做R中的條件「左連接」?

> df 
    a b 
    1 1 0 
    2 2 0 

> other.df 
    a b 
    1 2 3 

目標是與這個數據幀結束:

> final.df 
    a b 
    1 1 0 
    2 2 3 

我到目前爲止一直在寫代碼:

c <- merge(df, other.df, by=c("a"), all.x = TRUE) 
c[is.na(c$b.y),]$b.y <- 0 
d<-subset(c, select=c("a","b.y")) 
colnames(d)[2]<-b 

終於到達我想要的結果。

這樣做有效地使四行代碼非常不透明。 有沒有更好,更麻煩的方法來做到這一點?

+0

我要推薦** ** sqldf包,如果你想要做的數據幀更復雜的SQL類型的東西,但是和往常一樣,當我試圖將它解僱寫回答時,它一直在崩潰。所以......你知道......也許你會有更好的運氣。但對我而言這絕對不可靠。 – joran 2012-07-06 21:53:06

+0

@joran,建議您閱讀sqldf主頁(http://sqldf.googlecode.com/#Troubleshooting)上的'Troubleshooting'部分。 – 2012-07-10 22:56:02

+0

@ G.Grothendieck哦,我已經讀過了。我嘗試了FAQ#5中的所有內容,並且它仍然崩潰R. :( – joran 2012-07-10 23:25:28

回答

1

這裏有兩種方法。在這兩種情況下,第一行執行左側合併,返回所需的列。在merge的情況下,我們必須設置名稱。兩行中的最後一行用0代替NA

合併

res1 <- merge(df, other.df, by = "a", all.x = TRUE)[-2] 
names(res1) <- names(df) 
res1[is.na(res1)] <- 0 

sqldf

library(sqldf) 
res2 <- sqldf("select a, o.b from df left join 'other.df' o using(a)") 
res2[is.na(res2)] <- 0 
0

在兩行:

c <- merge(df, other.df,all=T) 
c=c[which(!duplicated(c$a)),] 

因此,這從兩個數據集所採用的值,並與來自第二ID重複省略了行。我不確定哪個是剩下的,哪個是正確的,所以如果你需要另一個:顛倒數據並做同樣的事情。

c=c[length(c$a):1,] 
c=c[which(!duplicated(c$a)),]