Есть ли метод R dplyr для слияния с all = TRUE?

У меня есть два фрейма данных R, которые я хочу объединить. В прямом R вы можете:

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)

который производит:

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

Я использую dplyr и предпочел бы такое решение, как:

left_join(cost, trees)

который дает что-то близкое к тому, что я хочу:

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

В dplyr я вижу left_join, inner_join, semi_join и anti-join, но ни один из них не делает того, что merge с all=TRUE.

Также - есть ли быстрый способ установить для NA значение 0? Мои усилия по использованию x$trees[is.na(x$trees)] <- 0; до сих пор трудоемки (мне нужна команда для каждого столбца) и, похоже, не всегда работают.

Благодарность


person Racing Tadpole    schedule 17.02.2014    source источник
comment
как насчет plyr::join_all?   -  person rawr    schedule 18.02.2014
comment
Когда вы объединяетесь с NA, ожидаете ли вы m x n множественности совпадающих NA?   -  person IRTFM    schedule 18.02.2014
comment
Достаточно ли этого? 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 превратит NA в 0 - на dplyr я думаю, что нет.   -  person Stephen Henderson    schedule 18.02.2014
comment
Нет, это будет outer_join(), который еще не реализован: github.com/hadley/dplyr/issues / 96   -  person hadley    schedule 18.02.2014
comment
Всем спасибо - пока буду использовать merge и подожду outer_join!   -  person Racing Tadpole    schedule 18.02.2014
comment
@hadley: Я тоже боролся с этим. Не могли бы вы добавить «external_join еще не реализовано, используйте base :: merge () или другую функцию» к странице руководства plyr :: * _ join?   -  person smci    schedule 12.04.2014


Ответы (2)


В самой последней версии dplyr (0.4.0) теперь есть опция full_join, которая, я думаю, вам и нужна.

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)

Возврат

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

А также

library(dplyr)
full_join(cost, trees)

Возврат

> 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
Пожалуйста, не заменяйте NA нулями. - person jaradniemi; 02.03.2016