web-dev-qa-db-fra.com

Existe-t-il une méthode R dplyr pour la fusion avec all = TRUE?

J'ai deux trames de données R que je veux fusionner. En R droit, vous pouvez faire:

cost <- data.frame(farm=c('farm A', 'office'), cost=c(10, 100))
trees <- data.frame(farm=c('farm A', 'farm B'), trees=c(20,30))
merge(cost, trees, all=TRUE)

qui produit:

    farm cost trees
1 farm A   10    20
2 office  100    NA
3 farm B   NA    30

J'utilise dplyr et préférerais une solution telle que:

left_join(cost, trees)

ce qui produit quelque chose de proche de ce que je veux:

    farm cost trees
1 farm A   10    20
2 office  100    NA

Dans dplyr je peux voir left_join, inner_join, semi_join Et anti-join, Mais rien de tout cela ne fait ce que merge avec all=TRUE.

Aussi - existe-t-il un moyen rapide de mettre les NA à 0? Mes efforts jusqu'à présent en utilisant x$trees[is.na(x$trees)] <- 0; sont laborieux (j'ai besoin d'une commande par colonne) et ne semblent pas toujours fonctionner.

merci

32
Racing Tadpole

La version la plus récente de dplyr (0.4.0) a maintenant une option full_join, ce que je crois que vous voulez.

cost <- data.frame(farm=c('farm A', 'office'), cost=c(10, 100))
trees <- data.frame(farm=c('farm A', 'farm B'), trees=c(20,30))
merge(cost, trees, all=TRUE)

Retour

> merge(cost, trees, all=TRUE)
        farm cost trees
    1 farm A   10    20
    2 office  100    NA
    3 farm B   NA    30

Et

library(dplyr)
full_join(cost, trees)

Retour

> full_join(cost, trees)
Joining by: "farm"
    farm cost trees
1 farm A   10    20
2 office  100    NA
3 farm B   NA    30
Warning message:
joining factors with different levels, coercing to character vector
25
Avraham
library(plyr)
> dat <- join(cost, trees, type = "full")
Joining by: farm
> dat
    farm cost trees
1 farm A   10    20
2 office  100    NA
3 farm B   NA    30

> dat[is.na(dat)] <- 0
> dat
    farm cost trees
1 farm A   10    20
2 office  100     0
3 farm B    0    30
1
Jiqing Huang