我想合并两个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
相同1}}确实。
此外 - 是否有快速方法将NA设置为0?到目前为止,我使用x$trees[is.na(x$trees)] <- 0;
所做的努力是费力的(我需要每列一个命令)并且似乎并不总是有效。
感谢
答案 0 :(得分:25)
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
答案 1 :(得分:1)
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