You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

对含重复UserID及名称的DataFrame聚合并计算均值与标准差

解决R DataFrame聚合计算均值与标准差的问题

嘿,我来帮你搞定这个数据聚合的需求!先把你提供的数据集复现出来:

DF <- data.frame(
  ID=c(101,101,101,101,101,102,102,102,102),
  Name=c("Ed","Ed","Hank","Hank","Hank","Sandy","Sandy","Jessica","Jessica"),
  Class=c("Junior","Junior","Junior","Junior", "Junior","High","High","Mid","Mid"),
  Scoring=c(11,15,18,18,12,20,22,25,26),
  Other_Scores=c(15,9,34,23,43,23,34,23,23)
)

从数据里能看到,同一个ID下可能对应不同Name(比如ID101对应Ed和Hank),而每个ID+Name组合的Class是一致的,所以我们可以按ID+Name+Class(或者简化为ID+Name)分组,计算Scoring和Other_Scores的均值与标准差。下面给你两种实用的实现方法:

方法一:使用Base R的aggregate函数

这是R原生的聚合方法,不需要额外安装包:

# 按ID、Name、Class分组,计算均值和标准差
agg_result <- aggregate(
  cbind(Scoring, Other_Scores) ~ ID + Name + Class,
  data = DF,
  FUN = function(x) c(mean = mean(x), sd = sd(x))
)

# 把返回的列表列展开为普通列,并重命名让结果更清晰
agg_result <- do.call(data.frame, agg_result)
names(agg_result) <- gsub("\\.(mean|sd)", "_\\1", names(agg_result))

# 查看结果
print(agg_result)

运行后会得到每个分组对应的两个指标的均值和标准差,列名会变成Scoring_mean、Scoring_sd这种清晰的格式。

方法二:使用dplyr包(tidyverse风格)

如果你习惯更直观的管道语法,dplyr会更友好,代码可读性更高:

# 先安装并加载dplyr(如果还没安装的话)
# install.packages("dplyr")
library(dplyr)

dplyr_result <- DF %>%
  # 指定分组变量
  group_by(ID, Name, Class) %>%
  # 计算每个指标的均值和标准差
  summarise(
    Scoring_mean = mean(Scoring),
    Scoring_sd = sd(Scoring),
    Other_Scores_mean = mean(Other_Scores),
    Other_Scores_sd = sd(Other_Scores),
    # 取消分组,返回普通DataFrame
    .groups = "drop"
  )

# 查看结果
print(dplyr_result)

这个方法的结果和base R的完全一致,但代码逻辑更直白,适合日常数据处理。

需要注意的是:如果你的数据里Class和ID+Name是严格一一对应的,那分组时可以去掉Class,直接按ID+Name分组,结果不会有变化。

内容的提问来源于stack exchange,提问作者Wokkel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:22:34