2014-09-12 112 views
2

在看到this post後,@akrun給出了一個很好的答案,我想玩dplyr。以下是來自post和akrun的示例數據。left_join(x,y)和NA

df = data.frame(
     id1 = c(1,1,2,2,2,3,3,3,3), 
     id2 = c(1,2,1,2,3,1,2,3,4), 
     X1 = letters[1:9], 
     X2 = LETTERS[1:9], 
     stringsAsFactors = FALSE 
    ) 
df2 <- data.frame(
     id1 = rep(c(1:3), each = 4), 
     id2 = rep(c(1:4), times = 3), 
     stringsAsFactors = FALSE 
    ) 

如果我複製akrun的答案,merge()完美的作品在這裏。

df %>% 
    do(merge(., df2, by = c("id1","id2"), all = TRUE)) 

    id1 id2 X1 X2 
1 1 1 a A 
2 1 2 b B 
3 1 3 <NA> <NA> 
4 1 4 <NA> <NA> 
5 2 1 c C 
6 2 2 d D 
7 2 3 e E 
8 2 4 <NA> <NA> 
9 3 1 f F 
10 3 2 g G 
11 3 3 h H 
12 3 4 i I 

然後,我想left_join(x,y)會做。 left_join(x,y)包括x的全部和匹配行y。從UseR!2014的dplyr教程pdf中的示例中,我預計會得到相同的結果。但是,情況並非如此。

> df %>% 
+  left_join(df2, .) 
Joining by: c("id1", "id2") 
    id1 id2 X1 X2 
1 1 1 a A 
2 1 2 b B 
3 1 3 <NA> <NA> 
4 1 4 <NA> <NA> 
5 2 1 <NA> <NA> 
6 2 2 <NA> <NA> 
7 2 3 <NA> <NA> 
8 2 4 <NA> <NA> 
9 3 1 <NA> <NA> 
10 3 2 <NA> <NA> 
11 3 3 <NA> <NA> 
12 3 4 <NA> <NA> 

的前三行表明,dplyr在做合適的工作。但是,一旦遇到NA,它會生成NA s直到結束。這是一個錯誤還是我做錯了什麼?感謝您抽出時間。

+0

另一個比較:' plyr :: join'行爲正確。 – Gregor 2014-09-12 17:45:21

回答

1

目前與dplyr一些錯誤和_join功能:

我看起來像他們被固定。在此同時,如果您確保該組由變量是同一類型(他們是不是在你的榜樣 - 您可以通過使用str()告訴),那麼它應該工作:

df = data.frame(
    id1 = c(1,1,2,2,2,3,3,3,3), 
    id2 = c(1,2,1,2,3,1,2,3,4), 
    X1 = letters[1:9], 
    X2 = LETTERS[1:9], 
    stringsAsFactors = FALSE 
) 

df2 <- data.frame(
    id1 = as.numeric(rep(c(1:3), each = 4)), 
    id2 = as.numeric(rep(c(1:4), times = 3)), 
    stringsAsFactors = FALSE 
) 

left_join(df2, df) 
+0

感謝您的支持。我測試了你的想法,並且解決了這個問題。如果'_join()'可以將整數和數字作爲merge()'可以,那將會很好。 – jazzurro 2014-09-13 02:53:49

+0

哈德利和團隊正在努力。我期望在發佈0.3版本時能夠解決這些問題。 – rrs 2014-09-14 14:27:00

+0

太好了。感謝更新! – jazzurro 2014-09-14 15:33:52