マージする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_join
、inner_join
、semi_join
、およびanti-join
が表示されますが、これらのいずれもall=TRUE
でmerge
のように動作しません。
また、NAを0に設定する簡単な方法はありますか?これまでのx$trees[is.na(x$trees)] <- 0;
の使用は面倒で(列ごとにコマンドが必要です)、常に機能するとは限りません。
ありがとう
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
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