You need to enable JavaScript to run this app. R语言如何计算分组数据的中位数、标准差并保留原有数据框结构
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.08 05:06:05