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

时间:2017-11-02 20:39:36

标签: r dplyr tidyverse

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

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))

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

2 个答案:

答案 0 :(得分:3)

如果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

答案 1 :(得分:0)

同样,虽然上面提出的问题可能有很多解决方案,但我正在寻找更优雅的方法来解决这个问题/想知道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))