2014-09-12 7 views
2

Après avoir vu this post avec une belle réponse par @akrun, je voulais jouer avec dplyr. Voici les exemples de données de la poste et akrun.left_join (x, y) et 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 
    ) 

Si je répliquer la réponse de akrun, merge() fonctionne parfaitement ici.

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 

Ensuite, je pensais que left_join(x,y) ferait. left_join(x,y) inclut l'ensemble de x et les lignes correspondantes de y. D'après les exemples du tutoriel pdf dplyr de UseR! 2014, je m'attendais à un résultat identique. Mais, ce n'était pas le cas.

> 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> 

Les trois premières lignes indiquent que dplyr faisait du bon travail. Mais, une fois qu'il a rencontré NA, il a généré NA s jusqu'à la fin. Est-ce un bug ou ai-je fait quelque chose de mal? Merci d'avoir pris votre temps.

+0

Une autre comparaison: ' plyr :: join' se comporte correctement. – Gregor

Répondre

1

Il n'y a quelques bugs avec dplyr et les _join fonctions:

Je regarde comme ils sont fixés. Dans le même temps, si vous assurez le groupe par des variables sont du même type (ils ne sont pas dans votre exemple - vous pouvez dire à l'aide str()), il devrait fonctionner:

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

Nous vous remercions de votre soutien. J'ai testé votre idée, et cela a résolu le problème. Ce serait génial si '_join()' peut prendre entier et nombre comme 'merge()' peut. – jazzurro

+0

Hadley et son équipe travaillent dessus. Je m'attends à ce que ces problèmes soient résolus lorsque la version 0.3 est publiée. – rrs

+0

C'est génial. Merci pour la mise à jour! – jazzurro