如何按组有效地汇总(具有多个输出)数据集中的列?

时间:2019-07-12 20:02:38

标签: r dplyr purrr

通常,我需要按组为变量提供摘要统计信息(平均值,标准偏差,中位数,Q1等)。

当前我正在使用类似的代码

data %>%
  group_by(region, group) %>%
  summarise(mean=mean(value),
            sd=sd(value),
            min=min(value),
            q1 = quantile(value, probs=0.25),
            median = median(value),
            q3 = quantile(value, probs=0.75),
            max=max(value))

我发现自己经常重复这种做法。有没有更好的方法来获取相同的汇总表?谢谢。

1 个答案:

答案 0 :(得分:0)

正如@January在注释中建议的那样,创建一个函数是一个好主意。在这里,我使用quos引述...的每个参数,然后使用group_by将它们拼接为!!!enquo用于将表达式转换为quosure。 !!然后在每个摘要函数的上下文中取消引用:

library(dplyr)
library(rlang)

summary_stats1 <- function(data, value, ...){
  value <- enquo(value)

  data %>%
    group_by(!!!quos(...)) %>%
    summarise(mean=mean(!!value),
              sd=sd(!!value),
              min=min(!!value),
              q1 = quantile(!!value, probs=0.25),
              median = median(!!value),
              q3 = quantile(!!value, probs=0.75),
              max=max(!!value))
}

或者,使用group_by_at。接受vars帮助函数,直接使用...

summary_stats2 <- function(data, value, ...){
  value <- enquo(value)

  data %>%
    group_by_at(vars(...)) %>%
    summarise(mean=mean(!!value),
              sd=sd(!!value),
              min=min(!!value),
              q1 = quantile(!!value, probs=0.25),
              median = median(!!value),
              q3 = quantile(!!value, probs=0.75),
              max=max(!!value))
}

我们还可以使用here中描述的新内插模式(rlang 0.4.0)来简化引用和取消引用的过程:

summary_stats3 <- function(data, value, ...){

  data %>%
    group_by_at(vars(...)) %>%
    summarise(mean=mean({{ value }}),
              sd=sd({{ value }}),
              min=min({{ value }}),
              q1 = quantile({{ value }}, probs=0.25),
              median = median({{ value }}),
              q3 = quantile({{ value }}, probs=0.75),
              max=max({{ value }}))
}

输出:

> summary_stats1(mtcars, mpg, gear, am)
> summary_stats2(mtcars, mpg, gear, am)
> summary_stats3(mtcars, mpg, gear, am)

# A tibble: 4 x 9
# Groups:   gear [3]
   gear    am  mean    sd   min    q1 median    q3   max
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl> <dbl> <dbl>
1     3     0  16.1  3.37  10.4  14.5   15.5  18.4  21.5
2     4     0  21.0  3.07  17.8  18.8   21    23.2  24.4
3     4     1  26.3  5.41  21    21.3   25.0  30.9  33.9
4     5     1  21.4  6.66  15    15.8   19.7  26    30.4