在R中计算测量值汇总统计并实现列透视
高效实现按分组统计并透视R数据框的方案
问题背景
我有如下R语言的dataframe:
Step <- c("1","1","4","3","2","2","3","4","4","3","1","3","2","4","3","1","2") Length <- c(0.1,0.5,0.7,0.8,0.2,0.1,0.3,0.8,0.9,0.15,0.25,0.27,0.28,0.61,0.15,0.37,0.18) Breadth <- c(0.13,0.35,0.87,0.38,0.52,0.71,0.43,0.8,0.9,0.15,0.45,0.7,0.8,0.11,0.11,0.47,0.28) Height <- c(0.31,0.35,0.37,0.38,0.32,0.51,0.53,0.48,0.9,0.15,0.35,0.32,0.22,0.11,0.17,0.27,0.38) Width <- c(0.21,0.25,0.27,0.8,0.2,0.21,0.3,0.28,0.29,0.65,0.55,0.37,0.26,0.31,0.5,0.7,0.8) df <- data.frame(Step,Length,Breadth,Height,Width)
我需要按Step分组,计算各测量指标(Length、Breadth、Height、Width)的max、min、mean、median、standard deviation,然后将结果转换为以测量指标为行,各分组统计值为列的透视格式,期望输出如下:
Measurement max_1 min_1 mean_1 median_1 sd_1 max_2 min_2 mean_2 median_2 sd_2 max_3 min_3 mean_3 median_3 sd_3 max_4 min_4 mean_4 median_4 sd_4 Length 0.50 0.10 0.3050 0.31 0.17058722 0.28 0.10 0.1900 0.190 0.07393691 0.80 0.15 0.334 0.27 0.2693139 0.90 0.61 0.7525 0.750 0.12526638 Breadth 0.47 0.13 0.3500 0.40 0.15577760 0.80 0.28 0.5775 0.615 0.23012680 0.70 0.11 0.354 0.38 0.2383904 0.90 0.11 0.6700 0.835 0.37567720 Height 0.35 0.27 0.3200 0.33 0.03829708 0.51 0.22 0.3575 0.350 0.12120919 0.53 0.15 0.310 0.32 0.1570032 0.90 0.11 0.4650 0.425 0.32888701 Width 0.70 0.21 0.4275 0.40 0.23669601 0.80 0.20 0.3675 0.235 0.28952547 0.80 0.30 0.524 0.50 0.2040343 0.31 0.27 0.2875 0.285 0.01707825
目前我用以下代码计算,但效率较低:
library(dplyr) df1 <- df %>% group_by(Step) %>% summarise(Length_Mean = mean(Length), Breadth_Mean = mean(Breadth), Height_Mean = mean(Height), Width_Mean = mean(Width))
请问如何用最少的代码高效实现上述需求?
高效实现方案
我们可以结合tidyr的重塑函数和dplyr的分组统计,全程用管道流完成,无需手动逐个指定指标,代码简洁又灵活:
完整代码
library(tidyverse) df %>% # 把宽数据转长数据,统一处理所有测量指标 pivot_longer(cols = -Step, names_to = "Measurement", values_to = "Value") %>% # 按分组和指标批量计算所有统计量 group_by(Step, Measurement) %>% summarise( max = max(Value), min = min(Value), mean = mean(Value), median = median(Value), sd = sd(Value), .groups = "drop" ) %>% # 转回宽格式,自动生成符合要求的列名 pivot_wider( names_from = Step, values_from = c(max, min, mean, median, sd), names_glue = "{.value}_{Step}" ) %>% # 按指定顺序排列指标行,匹配期望输出 arrange(factor(Measurement, levels = c("Length", "Breadth", "Height", "Width")))
代码解释
pivot_longer:将原宽格式数据转为长格式,所有测量指标(Length/Width等)都集中到Measurement列,数值统一在Value列,这样就不用单独处理每个指标了。- 分组统计:按
Step和Measurement分组,一次性计算max/min/mean/median/sd五个统计量,.groups = "drop"用于分组后取消分组状态,方便后续操作。 pivot_wider:把统计结果转回宽格式,通过names_glue参数自动生成max_1、mean_2这类符合要求的列名,完美匹配你的期望输出格式。arrange:最后按指定顺序排列Measurement的行,和示例输出的顺序完全一致。
这个方法的优势在于扩展性极强——不管后续新增多少测量指标,代码都不需要修改,而且全程管道流操作,逻辑清晰,比手动逐个写统计量的方式高效得多。
内容的提问来源于stack exchange,提问作者Sharath
相关产品推荐
相关产品推荐

