使用R dplyr分组计算均值并保留组内不变的非数值列
解决方案
你可以通过以下几种实用方式实现需求,核心逻辑是保留组内取值唯一的非数值列,同时计算数值列的分组均值:
方法1:将非数值列加入分组变量
由于state和region在每个team组内取值完全一致,直接把它们加入group_by即可,分组后计算数值列均值时,这些非数值列会自然保留:
library(dplyr) df %>% group_by(team, state, region) %>% summarise( pts = mean(pts), rebs = mean(rebs), ast = mean(ast), .groups = "drop" # 取消分组状态,返回普通数据框 )
方法2:用across批量处理不同类型列
如果列数较多,across能高效分别处理非数值列(取唯一值)和数值列(算均值):
df %>% group_by(team) %>% summarise( # 组内非数值列取值一致,取第一个值或唯一值都可 across(c(state, region), first), # 批量计算数值列的均值 across(c(pts, rebs, ast), mean), .groups = "drop" )
方法3:使用reframe函数(dplyr 1.0.0及以上版本)
reframe支持为每列单独指定处理逻辑,自动返回扁平化的数据框:
df %>% group_by(team) %>% reframe( state = unique(state), region = unique(region), pts = mean(pts), rebs = mean(rebs), ast = mean(ast) )
注意事项
- 需确保
state和region在每个team组内确实只有唯一值,若组内存在多值,以上方法会返回该组的所有唯一值,导致行数增加。 .groups = "drop"用于取消分组状态,若后续操作需要保留分组可省略该参数。
内容的提问来源于stack exchange,提问作者jeffgoblue
相关产品推荐
相关产品推荐

