web-dev-qa-db-ja.com

all = TRUEとマージするためのR dplyrメソッドはありますか?

マージする2つの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_joininner_joinsemi_join、およびanti-joinが表示されますが、これらのいずれもall=TRUEmergeのように動作しません。

また、NAを0に設定する簡単な方法はありますか?これまでのx$trees[is.na(x$trees)] <- 0;の使用は面倒で(列ごとにコマンドが必要です)、常に機能するとは限りません。

ありがとう

32
Racing Tadpole

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
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