Există o metodă R dplyr pentru îmbinare cu all=TRUE?

Am două cadre de date R pe care vreau să le îmbin. În dreapta R poți face:

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)

care produce:

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

Folosesc dplyr și aș prefera o soluție precum:

left_join(cost, trees)

care produce ceva aproape de ceea ce vreau:

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

În dplyr pot vedea left_join, inner_join, semi_join și anti-join, dar niciuna dintre acestea nu face ceea ce face merge cu all=TRUE.

De asemenea, există o modalitate rapidă de a seta NA la 0? Eforturile mele de până acum folosind x$trees[is.na(x$trees)] <- 0; sunt laborioase (am nevoie de o comandă pe coloană) și nu par să funcționeze întotdeauna.

Mulțumiri


person Racing Tadpole    schedule 17.02.2014    source sursă
comment
ce zici de plyr::join_all?   -  person rawr    schedule 18.02.2014
comment
Când vă îmbinați cu NA vă așteptați la multiplicitatea m x n de NA potrivite?   -  person IRTFM    schedule 18.02.2014
comment
Ar fi suficient acest lucru? library(zoo); cost %.% merge(trees, all = TRUE) %.% lapply(na.fill, fill = 0) %.% as.data.frame()   -  person G. Grothendieck    schedule 18.02.2014
comment
DF[is.na(DF)]<-0 va transforma NA la 0 - pe dplyr Cred că nu.   -  person Stephen Henderson    schedule 18.02.2014
comment
Nu, acesta ar fi outer_join(), care nu este încă implementat: github.com/hadley/dplyr/issues /96   -  person hadley    schedule 18.02.2014
comment
Mulțumesc tuturor - voi folosi merge pentru moment și voi aștepta outer_join!   -  person Racing Tadpole    schedule 18.02.2014
comment
@hadley: Pur și simplu mă luptam cu asta. Puteți adăuga „outer_join not implemented yet, use base::merge() or other function” la pagina de manual plyr::*_join?   -  person smci    schedule 12.04.2014


Răspunsuri (2)


Cea mai recentă versiune a dplyr (0.4.0) are acum o opțiune full_join, ceea ce cred că doriți.

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)

Se intoarce

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

Și

library(dplyr)
full_join(cost, trees)

Se intoarce

> 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
person Avraham    schedule 14.01.2015

person    schedule
comment
Vă rugăm să nu înlocuiți NA cu zerouri. - person jaradniemi; 02.03.2016