双向连接在dplyr中以恢复值

use*_*782 2 r left-join dplyr

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

假设您有2个DF:

df1:mode   df2:sex
1           1
2           2
3
Run Code Online (Sandbox Code Playgroud)

以及大多数组合不存在的DF3,例如

mode | sex  | cases      
1        1      9
1        1      2
2        2      7
3        1      2
1        2      5
Run Code Online (Sandbox Code Playgroud)

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

  mode | sex  | cases      
    1        1     11
    1        2     5
    2        1     0
    2        2     7
    3        1     2
    3        2     0    
Run Code Online (Sandbox Code Playgroud)

如果你单个left_join(left_join(df1,df3)你恢复不在df3中的模式,但'Sex'显示为'NA',如果你执行left_join(df2,df3)则相同.

所以你怎么能做左联接来恢复所有缺席组合,案例= 0?dplyr首选,但sqldf是一个选项.

在此先感谢,p.

aos*_*ith 5

tidyr的开发版本,tidyr_0.2.0.9000,有一个新功能complete,我前几天看到它看起来像是出于这种情况.

帮助页面说:

这是expand(),left_join()和replace_na的包装,它对于完成缺少的数据组合很有用.它将隐式缺失值转换为显式缺失值.

要添加缺少的组合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
Run Code Online (Sandbox Code Playgroud)

你仍然需要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
Run Code Online (Sandbox Code Playgroud)