R语言如何计算分组数据的中位数、标准差并保留原有数据框结构
问题修正与实现方案
你之前的代码无法得到预期结果的核心原因有两个:
- 分组逻辑错误:直接按完整
Mydata值分组时,3条数据的Mydata分别为AAA_F1/AAA_F2/AAA_F3,均为唯一值,等于每行单独成组,无法实现同前缀3行的聚合。 - 旧版
funs()写法兼容性差,且group_by后直接summarise_all会把非数值的T列也纳入统计逻辑,不符合输出要求。
步骤1:构造分组标识
先提取Mydata列中下划线前的共同前缀作为分组依据,无需额外安装包,直接用base R的gsub即可实现:
# 去掉Mydata里下划线及后续内容,提取前缀作为分组键 df$group_key <- gsub("_.*", "", df$Mydata)
步骤2:生成分组中位数统计数据
按提取的前缀分组,仅对所有数值列计算中位数,最后把分组列重命名为期望的Mydata即可:
library(dplyr) df_median <- df %>% group_by(group_key) %>% # 自动筛选所有数值列计算中位数,跳过非数值字段 summarise(across(where(is.numeric), median)) %>% rename(Mydata = group_key) %>% as.data.frame()
如果需要保留T列,可在summarise内单独指定,比如加T = first(T),可按需调整取值规则。
步骤3:生成分组标准差统计数据
逻辑和中位数完全一致,仅替换统计函数为sd即可:
df_sd <- df %>% group_by(group_key) %>% summarise(across(where(is.numeric), sd)) %>% rename(Mydata = group_key) %>% as.data.frame()
结果说明
- 你给出的示例输出里
X100的中位数为7611.5不符合真实统计规则:样例数据里X100原始值为500, 0, 12257.1,排序后为0, 500, 12257.1,实际中位数为500,示例值为示意用。 - 之前用
lapply输出的是列表结构,不是规整的data.frame,因此和你需要的表格格式不匹配,上述方法可直接输出符合要求的data.frame。 - 如果使用低于1.0版本的旧版dplyr,可把
across那行替换为summarise_at(vars(ends_with(c("100", "10M", "3100", "220M", "400M", "600"))), funs(median))即可兼容。
内容的提问来源于stack exchange,提问作者nik
相关产品推荐
相关产品推荐

