通常,我需要按组为变量提供摘要统计信息(平均值,标准偏差,中位数,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))
我发现自己经常重复这种做法。有没有更好的方法来获取相同的汇总表?谢谢。
答案 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