R语言如何按ID分组对数据框多列批量应用去均值函数
批量分组去均值实现方案
以下方案完全适配你现有的dplyr工作流,和你单处理esgscore列的逻辑、输出结果完全对齐:
1. 保留分组均值中间列的写法(完全匹配你现有单列逻辑的输出格式)
直接复用你单列处理时「生成分组均值列、生成去均值结果列」的规则,批量处理3-111列:
demeaned_df <- df %>% group_by(ID) %>% mutate( across( .cols = 3:111, .fns = list( # 分组均值计算逻辑 avg = ~ mean(.x), # 去均值计算逻辑 demeaned = ~ .x - mean(.x) ), # 列名自动按「类型_原列名」规则生成,和你原单列的命名规则完全一致 .names = "{.fn}_{.col}" ) ) %>% ungroup()
2. 精简版(不需要保留分组均值中间列时使用)
如果你只需要去均值结果、不需要单独留存分组均值的中间变量,可以直接一步计算,运行效率更高:
demeaned_df <- df %>% group_by(ID) %>% # 直接在分组内算每列均值并做差,生成去均值结果 mutate(across(3:111, ~ .x - mean(.x), .names = "demeaned_{.col}")) %>% ungroup()
注意事项
- 此处的
3:111是按数据框当前的列顺序定位范围,如果你后续调整了df的列排序,这个索引范围会同步变动;如果想要写法更稳健,可以把3:111替换为对应列的匹配规则,比如所有数值型列就替换为where(is.numeric),或按列名前缀匹配替换为starts_with("你的列名前缀") - 原列存在缺失值时,默认
mean(.x)会返回NA,若需要忽略缺失值计算均值,只需在对应函数里补充na.rm = TRUE参数即可 - 处理完成后一定要调用
ungroup()取消分组状态,避免后续操作默认按ID分组,出现预期外的结果
可以先单独拿
esgscore列跑两种写法,和你原单列代码的输出结果做对比,确认完全一致后再运行全量数据。
内容的提问来源于stack exchange,提问作者Luca
相关产品推荐
相关产品推荐

