32

我有两个要合并的 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,但这些都没有做with做的事情。semi_joinanti-joinmergeall=TRUE

另外 - 有没有一种快速的方法可以将 NA 设置为 0?到目前为止,我的努力很x$trees[is.na(x$trees)] <- 0;费力(我需要每列一个命令)并且似乎并不总是有效。

谢谢

4

2 回答 2

25

(0.4.0)的最新版本dplyr现在有一个 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
于 2015-01-14T04:26:25.317 回答
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
于 2014-07-28T08:39:07.627 回答