跨tibble执行算术运算:无硬编码实现分组变量乘均值除标准差
实现方案(完全无硬编码变量名)
无需手动指定a/b/c的变量名,后续新增待处理变量也无需修改代码,tidyverse风格实现如下:
library(tidyverse) # 自动识别所有待处理的变量(自动排除分组列group) target_vars <- setdiff(names(df), "group") df_result <- df %>% # 关联分组汇总数据 left_join(df_summary, by = "group") %>% # 批量处理所有待处理变量 mutate(across( .cols = all_of(target_vars), .fns = ~ .x * .data[[paste0(cur_column(), "_mean")]] / .data[[paste0(cur_column(), "_sd")]], .names = "{.col}_transformed" # 可自定义输出列名规则 )) %>% # 按需删除不需要的汇总列,保留原数据和转换后的结果 select(group, all_of(target_vars), ends_with("_transformed"))
核心逻辑说明
- 用
setdiff自动提取原数据中除分组列外的所有待处理变量,无需手动罗列变量名 - 合并原数据与汇总表后,通过
across批量遍历所有待处理变量 - 借助
cur_column()动态获取当前处理的变量名,自动匹配对应的分组均值、标准差列完成计算 - 用
.data代词读取列值,避免环境变量冲突,比get()函数更符合tidyverse编程规范 - 可通过修改
.names参数自定义转换后列的命名规则
内容的提问来源于stack exchange,提问作者sparklink
相关产品推荐
相关产品推荐

