是否有用于与 all=TRUE 合并的 R dplyr 方法?

Posted

技术标签:

【中文标题】是否有用于与 all=TRUE 合并的 R dplyr 方法?【英文标题】:Is there an R dplyr method for merge with all=TRUE? 【发布时间】:2014-03-17 11:04:12 【问题描述】:

我有两个要合并的 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_joinanti-join,但这些都没有mergeall=TRUE 的作用。

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

谢谢

【问题讨论】:

plyr::join_all 呢? 当您与 NA 合并时,您是否期望“匹配 NA”的 m x n 多重性? DF[is.na(DF)]&lt;-0 会将 NA 变为 0 - 在 dplyr 上我认为不是。 不,应该是outer_join(),尚未实现:github.com/hadley/dplyr/issues/96 @hadley:我也在为此苦苦挣扎。能否请您在 plyr::*_join 手册页中添加 'outer_join 尚未实现,使用 base::merge() 或其他函数' 【参考方案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

【讨论】:

请不要用零替换 NA。

以上是关于是否有用于与 all=TRUE 合并的 R dplyr 方法?的主要内容,如果未能解决你的问题,请参考以下文章

R语言merge函数左连接dataframe数据(Left (outer) join in R)左连接必须将参数all设置(all.x = TRUE)默认merge函数通过公共列名合并数据集

R等同于SAS的“In”数据集选项,用于包含和排除重叠数据

R语言之merge举例

R语言数据表匹配和拼接-merge函数

[APIO2013]机器人

在 R 中合并多个数据帧时如何使用 suffixes 参数?