我已经检查了这个问题,但找不到匹配的条目.
假设您有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.
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_by并summarise获得你想要的最终输出.
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)