dplyr-esque 方法来执行分组和未分组的汇总操作

dplyr-esque way to perform summary operations both grouped and ungrouped

我希望能够多次使用 dplyr 对一组数据执行相同的操作。每次我执行该操作时,我都希望有一组不同的列,我 group_by()。我如何以最 dplyr 式的方式执行此操作(最佳情况下,无需复制和粘贴代码或创建单独的中间对象):

library(dplyr)
mtcars %>% 
    group_by(cyl, gear) %>% 
    summarise(`Mean mpg` = mean(mpg),
              `Mean hp` = mean(hp))

mtcars %>% 
    group_by(cyl) %>% 
    summarise(`Mean mpg` = mean(mpg),
              `Mean hp` = mean(hp))

就像某些上下文一样,虽然这是一个简单的示例,但我更感兴趣的是将它的使用扩展到我可能 运行 需要更长的函数管道的实例,例如 运行 分层和未分层数据的逻辑回归模型......但这超出了问题的范围。

如果 w 不知道组数,那么一种选择是使用 ...(假设获得 mean 的变量是相同的

f1 <- function(dat, ...){
   dat %>%
      group_by_at(vars(...)) %>%
      summarise_at(vars('mpg', 'hp'), funs(Mean = mean(.)))
   }

f1(mtcars, 'cyl', 'gear')
#    cyl  gear mpg_Mean  hp_Mean
#  <dbl> <dbl>    <dbl>    <dbl>
#1     4     3   21.500  97.0000
#2     4     4   26.925  76.0000
#3     4     5   28.200 102.0000
#4     6     3   19.750 107.5000
#5     6     4   19.750 116.5000
#6     6     5   19.700 175.0000
#7     8     3   15.050 194.1667
#8     8     5   15.400 299.5000


f1(mtcars, 'cyl')
# A tibble: 3 x 3
#    cyl mpg_Mean   hp_Mean
#   <dbl>    <dbl>     <dbl>
#1     4 26.66364  82.63636
#2     6 19.74286 122.28571
#3     8 15.10000 209.21429

同样,虽然上面提出的问题可能有很多解决方案,但我正在寻找更优雅的方法来解决 this/wondered 如果 dplyr 中内置了一些我没有注意到的方法.

另一种可能的解决方案如下:

mtcars.2 <- mtcars %>% 
    mutate(gear = as.character(gear))

mtcars.2 <- bind_rows(mtcars.2,
                      mtcars.2 %>% 
                          mutate(gear = "All gears"))

mtcars.2 %>% 
    group_by(cyl, gear) %>% 
    summarise(`Mean mpg` = mean(mpg),
              `Mean hp` = mean(hp))