首页 文章

双向连接在dplyr中以恢复值

提问于
浏览
2

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

假设您有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)则相同 .

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

在此先感谢,p .

2 回答

  • 3

    首先,这里是您更友好,可重复的格式的数据

    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 中看到完整外连接的选项,所以我将在这里使用基本R来合并 df1df2 以获得所有模式/性别组合 . 然后我将其连接到数据并用零替换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
    
  • 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
    

    你仍然需要 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
    

相关问题