双左加入 dplyr 以恢复值

Double left join in dplyr to recover values

我已经检查过这个问题,但找不到匹配的条目。

假设您有 2 个 DF:

df1:mode   df2:sex
1           1
2           2
3

以及大部分组合都不存在的 DF3,例如

mode | sex  | cases      
1        1      9
1        1      2
2        2      7
3        1      2
1        2      5

你想用 dplyr 总结它获得所有组合(不存在的组合=0):

  mode | sex  | cases      
    1        1     11
    1        2     5
    2        1     0
    2        2     7
    3        1     2
    3        2     0    

如果您执行单个 left_join (left_join(df1,df3),您将恢复 df3 中没有的模式,但 'Sex' 显示为 'NA',并且同样,如果你做 left_join(df2,df3).

那么在 cases=0 的情况下,如何同时执行 left join 来恢复所有缺失的组合?首选 dplyr,但 sqldf 是一个选项。

提前致谢,p.

首先,这是一种更友好、可重现格式的数据

df1 <- data.frame(mode=1:3)
df2 <- data.frame(sex=1:2)
df3 <- data.frame(mode=c(1,1,2,3,1), sex=c(1,1,2,1,2), cases=c(9,2,7,2,5))

我在 dplyr 中没有看到完全外部联接的选项,所以我打算在这里使用 base R 合并 df1df2 以获得所有mode/sex 组合。然后我将其加入数据并将 NA 值替换为零。

mm <- merge(df1,df2) %>% left_join(df3)
mm$cases[is.na(mm$cases)] <- 0
mm %>% group_by(mode,sex) %>% summarize(cases=sum(cases))

这给出了

  mode sex cases
1    1   1    11
2    1   2     5
3    2   1     0
4    2   2     7
5    3   1     2
6    3   2     0

tidyr的开发版,tidyr_0.2.0.9000,有一个新的函数叫做complete,我前几天看到的好像它就是为这种情况而制作的。

帮助页面说:

This is a wrapper around expand(), left_join() and replace_na that's useful for completing missing combinations of data. It turns implicitly missing values into explicitly missing values.

要添加 df3 的缺失组合并改为填充 0 值,您可以这样做:

library(tidyr)
library(dplyr)

df3 %>% complete(mode, sex, fill = list(cases = 0))

  mode sex cases
1    1   1     9
2    1   1     2
3    1   2     5
4    2   1     0
5    2   2     7
6    3   1     2
7    3   2     0

您仍然需要 group_bysummarise 以获得您想要的最终输出。

df3 %>% complete(mode, sex, fill = list(cases = 0)) %>%
    group_by(mode, sex) %>%
    summarise(cases = sum(cases))

Source: local data frame [6 x 3]
Groups: mode

  mode sex cases
1    1   1    11
2    1   2     5
3    2   1     0
4    2   2     7
5    3   1     2
6    3   2     0