R语言如何将dataframe每行与aggregate聚合结果按分组对比
R语言实现分组聚合结果匹配与标签生成
方法1:基于现有aggregate结果的基础R实现
你已生成的agg_df默认列名为Group.1(存储分组队伍名)和x(存储分组平均得分),首先做列名修正后匹配回原数据,再做值对比即可:
# 修正聚合表列名,便于匹配 colnames(agg_df) <- c("team", "team_mean_pts") # 按team字段将分组均值匹配到原数据每一行 df <- merge(df, agg_df, by = "team", all.x = TRUE) # 嵌套ifelse判断生成performance列 df$performance <- ifelse( df$pts > df$team_mean_pts, "over", ifelse(df$pts < df$team_mean_pts, "under", "average") ) # 可选:删除临时增加的均值列 df$team_mean_pts <- NULL
方法2:更简洁的dplyr实现
不需要单独生成聚合表,分组后直接计算判断,代码可读性更高:
# 加载dplyr包(未安装先执行install.packages("dplyr")) library(dplyr) df <- df %>% # 按team分组 group_by(team) %>% # 分组内计算均值并对比生成标签 mutate(performance = case_when( pts > mean(pts) ~ "over", pts < mean(pts) ~ "under", TRUE ~ "average" )) %>% # 取消分组,避免后续操作受分组属性影响 ungroup()
最终输出效果示例
| team | pts | rebs | performance |
|---|---|---|---|
| a | 5 | 8 | under |
| a | 8 | 8 | over |
| b | 14 | 9 | over |
| b | 18 | 3 | over |
| b | 5 | 8 | under |
| c | 7 | 7 | average |
| c | 7 | 4 | average |
内容的提问来源于stack exchange,提问作者mathplzfun
相关产品推荐
相关产品推荐

