【问题标题】:Summarize data with observations for all combinations of factors用所有因素组合的观测值汇总数据
【发布时间】:2020-03-21 19:20:13
【问题描述】:

有时需要一个完整的数据框,其中包含对所有分组因素组合的观察结果,即使原始数据中不存在这些因素(即通过用 NA 数据填补这些空白)。

考虑以下带有mtcars 的示例:

mtcars %>% group_by(cyl, gear) %>% dplyr::summarise(N = n())
# A tibble: 8 x 3
# Groups:   cyl [3]
    cyl  gear     N
  <dbl> <dbl> <int>
1     4     3     1
2     4     4     8
3     4     5     2
4     6     3     2
5     6     4     4
6     6     5     1
7     8     3    12
8     8     5     2

当按cylgear 分组时,cyl=8gear=4 的观测值缺失。是否有可能以一种简单的、希望基于 tidyverse 的方式获得这个汇总表,其中包括一行对缺失的因素组合进行 NA 观察的行?例如。期望的输出是:

# A tibble: 9 x 3
# Groups:   cyl [3]
    cyl  gear     N
  <dbl> <dbl> <int>
1     4     3     1
2     4     4     8
3     4     5     2
4     6     3     2
5     6     4     4
6     6     5     1
7     8     3    12
8     8     4    NA
9     8     5     2

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    ungroup去掉组属性后我们可以用complete

    library(dplyr)
    library(tidyr)
    mtcars %>% 
        group_by(cyl, gear) %>%
        dplyr::summarise(N = n()) %>%
        ungroup %>%
        complete(cyl, gear)
    # A tibble: 9 x 3
    #    cyl  gear     N
    #  <dbl> <dbl> <int>
    #1     4     3     1
    #2     4     4     8
    #3     4     5     2
    #4     6     3     2
    #5     6     4     4
    #6     6     5     1
    #7     8     3    12
    #8     8     4    NA
    #9     8     5     2
    

    或者另一种选择是使用列的唯一元素创建一个组合数据集,然后执行left_join(不像前一个那么简单)

    crossing(cyl = unique(mtcars$cyl), gear = unique(mtcars$gear)) %>% 
        left_join(mtcars %>% 
                      group_by(cyl, gear) %>%
                      dplyr::summarise(N = n()))
    

    【讨论】:

      【解决方案2】:

      如果您将组转换为因子并使用countgroup_bysummarise n() 的替代方案)和.drop = FALSE,它将完成缺失的观察。

      library(dplyr)
      
      mtcars %>% mutate_at(vars(cyl, gear), factor) %>% count(cyl, gear, .drop = FALSE)
      
      #  cyl   gear      N
      #  <fct> <fct> <int>
      #1 4     3         1
      #2 4     4         8
      #3 4     5         2
      #4 6     3         2
      #5 6     4         4
      #6 6     5         1
      #7 8     3        12
      #8 8     4         0
      #9 8     5         2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-07
        • 1970-01-01
        • 2019-01-23
        • 2016-04-11
        相关资源
        最近更新 更多