如何修改R语言my_summary函数以支持可变数量的分组变量与汇总变量?
实现支持可变数量分组与汇总变量的my_summary函数
当然可以实现!在tidyverse的语法体系下,我们只需要对原函数做几处简单调整,就能让它支持任意数量的分组变量和汇总变量。下面是修改后的完整方案:
修改后的函数代码
suppressPackageStartupMessages({ library(tidyverse) }) set.seed(4321) demo_df <- tibble(age=as.integer(rep(c(10,20),each=10)), gender=rep(c("f","m"),10), weight=rnorm(20,70,7), size=rnorm(20,160,15)) my_summary <- function(df_in, ..., summary_vars) { df_in |> # 用...接收任意数量的分组变量 group_by(...) |> # 用across批量处理多个汇总变量,计算均值 summarise(across({{summary_vars}}, mean), .groups = "drop") }
关键调整说明
- 可变分组变量:通过
...(点参数)来接收任意数量的分组变量,直接传入group_by()即可,不管是1个还是多个分组维度都能处理。 - 可变汇总变量:用
summary_vars参数配合{{}}(整洁评估)和across()函数,across()可以批量对多个变量应用统计函数(这里是mean),完美支持多个汇总变量的需求。 - 可选的
.groups = "drop":用来自动移除分组属性,让输出结果更整洁,避免后续操作可能出现的分组冲突。
示例用法
单个分组+单个汇总变量
my_summary(demo_df, gender, summary_vars = weight)
输出结果:
# A tibble: 2 × 2 gender weight <chr> <dbl> 1 f 71.4 2 m 68.8
多个分组+多个汇总变量
my_summary(demo_df, age, gender, summary_vars = c(weight, size))
输出结果:
# A tibble: 4 × 4 age gender weight size <int> <chr> <dbl> <dbl> 1 10 f 72.0 162. 2 10 m 69.4 157. 3 20 f 70.7 159. 4 20 m 68.2 160.
如果需要支持更多统计量(比如同时计算均值和标准差),还可以进一步扩展across()的参数,比如across({{summary_vars}}, list(mean = mean, sd = sd)),这个可以根据你的需求灵活调整。
内容的提问来源于stack exchange,提问作者Erich Neuwirth




