如何修改自定义函数实现按分组映射多变量汇总统计?
解决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
相关产品推荐
相关产品推荐

