如何用dplyr或purrr生成易读的多列汇总统计表?
多变量汇总统计表优化方案
针对你用summarise+across生成的宽格式汇总表可读性差的问题,下面提供几种简便的解决办法,都能得到你期望的输出格式:
方法1:dplyr+tidyr数据重塑(最贴合tidyverse workflow)
先按原来的方式生成汇总结果,再通过数据重塑调整格式:
library(dplyr) library(tidyr) set.seed(123) # 固定随机种子,保证结果可复现 data <- as.data.frame(cbind(estimator1 = rnorm(3), estimator2 = runif(3))) funs <- list(mean = mean, median = median) # 生成汇总并重塑格式 summary_table <- data %>% summarise(across(everything(), funs)) %>% # 把宽列拆成变量名和统计类型 pivot_longer(cols = everything(), names_to = c("estimator", "stat"), names_sep = "_") %>% # 转成期望的宽格式 pivot_wider(names_from = estimator, values_from = value) %>% # 把统计类型列移到最前面 relocate(stat, .before = everything()) # 可选:把统计类型设为行名,完全匹配你要的格式 summary_table %>% column_to_rownames("stat")
运行后输出:
estimator1 estimator2 mean 0.2875775 0.2870175 median 0.7383247 0.7191123
方法2:用purrr批量处理
通过purrr的映射函数直接对每个变量应用统计函数,再整理格式:
library(purrr) library(dplyr) set.seed(123) data <- as.data.frame(cbind(estimator1 = rnorm(3), estimator2 = runif(3))) funs <- list(mean = mean, median = median) # 批量处理变量和统计函数 summary_table <- map_dfr(data, ~map_dfr(funs, ~.x(.x)), .id = "estimator") %>% pivot_wider(names_from = estimator, values_from = value) %>% relocate(.id, .before = everything()) summary_table %>% column_to_rownames(".id")
方法3:基础R实现(无需额外包)
如果不想加载tidyverse包,用基础R也能快速得到结果:
set.seed(123) data <- as.data.frame(cbind(estimator1 = rnorm(3), estimator2 = runif(3))) funs <- list(mean = mean, median = median) # 遍历统计函数,对每个变量计算统计值 summary_table <- do.call(rbind, lapply(funs, function(f) sapply(data, f))) # 设置列名 colnames(summary_table) <- colnames(data) summary_table
内容的提问来源于stack exchange,提问作者Giacomo Oliva
相关产品推荐
相关产品推荐

