对含重复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
相关产品推荐
相关产品推荐

