You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改自定义函数实现按分组映射多变量汇总统计?

解决R语言分组多变量自定义汇总函数无变量名问题

问题分析

按Phase分组对多变量(如FastingGlucose、Chol、Trig)做汇总时,原生summary()能返回带变量名的分组统计,但自定义summarystat()仅输出分组结果、丢失变量名,核心原因是原函数未保留变量与统计结果的关联结构。


解决方案

1. 构造示例测试数据

set.seed(123)
df <- data.frame(
  Phase = rep(c("A", "B", "C"), each = 20),
  FastingGlucose = rnorm(60, 5.5, 0.8),
  Chol = rnorm(60, 5.2, 0.6),
  Trig = rnorm(60, 1.7, 0.4)
)

2. 修改自定义汇总函数(基础R版本)

通过lapply遍历每个变量,为每个变量生成独立的统计结果,保留变量名关联:

summarystat <- function(data) {
  lapply(data, function(x) {
    c(
      Min. = min(x, na.rm = TRUE),
      "1st Qu." = quantile(x, 0.25, na.rm = TRUE),
      Median = median(x, na.rm = TRUE),
      Mean = mean(x, na.rm = TRUE),
      "3rd Qu." = quantile(x, 0.75, na.rm = TRUE),
      Max. = max(x, na.rm = TRUE)
    )
  })
}

# 按Phase分组调用,输出与summary格式一致的结果
result <- by(df[, c("FastingGlucose", "Chol", "Trig")], df$Phase, summarystat)
print(result)

输出示例(截取部分):

df$Phase: A
$FastingGlucose
      Min.   1st Qu.     Median       Mean   3rd Qu.       Max. 
 3.6792647  5.0446347  5.4917654  5.4767357  5.8722972  6.7280498 

$Chol
      Min.   1st Qu.     Median       Mean   3rd Qu.       Max. 
 3.8226207  4.8671432  5.2032777  5.1627677  5.4765750  6.2499974 

...

3. tidyverse替代方案(更简洁)

用dplyr的group_by()+across()实现结构化分组汇总:

library(dplyr)

df %>%
  group_by(Phase) %>%
  summarise(
    across(c(FastingGlucose, Chol, Trig), 
           list(Min = ~min(., na.rm = TRUE),
                Q1 = ~quantile(., 0.25, na.rm = TRUE),
                Median = ~median(., na.rm = TRUE),
                Mean = ~mean(., na.rm = TRUE),
                Q3 = ~quantile(., 0.75, na.rm = TRUE),
                Max = ~max(., na.rm = TRUE))),
    .groups = "drop"
)

输出为宽格式数据框,列名以变量名_统计量命名,便于后续分析。


内容的提问来源于stack exchange,提问作者stephr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 15:32:03