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.
Une autre comparaison: ' plyr :: join' se comporte correctement. – Gregor