【问题标题】:Use summarise and summarise_at in same dplyr chain在同一个 dplyr 链中使用 summarise 和 summarise_at
【发布时间】:2019-08-07 01:20:02
【问题描述】:

假设我想在用不同的函数分组后总结一个数据框。我该怎么做?

mtcars %>% group_by(cyl) %>% summarise(size = n())
# A tibble: 3 x 2
    cyl  size
  <dbl> <int>
1     4    11
2     6     7
3     8    14

但如果我尝试:

mtcars %>% group_by(cyl) %>% summarise(size = n()) %>% summarise_at(vars(c(mpg, am:carb)), mean)
Error in is_string(y) : object 'carb' not found

我怎样才能先用n() 获得每个组的大小,然后再获得其他所选特征的平均值?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    这是一种在分组变量的两个汇总操作上使用dplyr::inner_join() 的方法:

    mtcars %>% 
      group_by(cyl) %>% 
      summarise(size = n()) %>% 
      inner_join( 
        mtcars %>%
          group_by(cyl) %>%
          summarise_at(vars(c(mpg, am:carb)), mean),
        by='cyl' )
    

    输出是:

    # A tibble: 3 x 6
        cyl  size   mpg    am  gear  carb
      <dbl> <int> <dbl> <dbl> <dbl> <dbl>
    1     4    11  26.7 0.727  4.09  1.55
    2     6     7  19.7 0.429  3.86  3.43
    3     8    14  15.1 0.143  3.29  3.5 
    

    【讨论】:

      【解决方案2】:

      由于summarise 删除了未分组或汇总的列,因此在这种情况下,另一种方法是首先添加一个带有mutate 的新列(以便所有其他列保持原样)以计算行数在每个组中,并将该列包含在summarise_at 计算中。

      library(dplyr)         
      
      mtcars %>%
         group_by(cyl) %>%
         mutate(n = n()) %>%
         summarise_at(vars(mpg, am:carb, n), mean)
      
      # A tibble: 3 x 6
      #    cyl   mpg    am  gear  carb     n
      #  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
      #1     4  26.7 0.727  4.09  1.55    11
      #2     6  19.7 0.429  3.86  3.43     7
      #3     8  15.1 0.143  3.29  3.5     14
      

      【讨论】:

        【解决方案3】:

        我们可以使用data.table 方法

        library(data.table)
        as.data.table(mtcars)[, n := .N, cyl][, lapply(.SD, mean), cyl, 
                .SDcols = c("mpg", "am", "gear", "carb", "n")]
        #.   yl      mpg        am     gear     carb  n
        #1:   6 19.74286 0.4285714 3.857143 3.428571  7
        #2:   4 26.66364 0.7272727 4.090909 1.545455 11
        #3:   8 15.10000 0.1428571 3.285714 3.500000 14
        

        tidyverse

        library(tidyverse)
        mtcars %>%
           add_count(cyl) %>%
           group_by(cyl) %>%
           summarise_at(vars(mpg, am:carb, n), mean)
        # A tibble: 3 x 6
        #    cyl   mpg    am  gear  carb     n
        #  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
        #1     4  26.7 0.727  4.09  1.55    11
        #2     6  19.7 0.429  3.86  3.43     7
        #3     8  15.1 0.143  3.29  3.5     14
        

        或使用base R

        nm1 <- c("mpg", "am", "gear", "carb", "cyl")
        transform(aggregate(.~ cyl, mtcars[nm1], mean), n = as.vector(table(mtcars$cyl)))
        #  cyl      mpg        am     gear     carb  n
        #1   4 26.66364 0.7272727 4.090909 1.545455 11
        #2   6 19.74286 0.4285714 3.857143 3.428571  7
        #3   8 15.10000 0.1428571 3.285714 3.500000 14
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-27
          • 1970-01-01
          • 2022-11-23
          • 1970-01-01
          • 1970-01-01
          • 2018-02-03
          相关资源
          最近更新 更多