Есть ли метод 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;
были трудоемкими (мне нужна команда за столбец) и не всегда работают.
спасибо
Ответы
Ответ 1
В последней версии 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
Ответ 2
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