You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何修改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

火山引擎 最新活动