如何用across()等函数批量生成匹配列名规则的新计算列?
批量创建对应差值列的解决方案
当然可以用dplyr的mutate()、across()等函数实现批量创建新列,无需手动逐个定义。以下是针对你的场景的高效实现方式:
核心代码实现
set.seed(123) library(dplyr) # 构造示例数据 df <- tibble(x = seq(1:10), bm_a = runif(10), val_a = runif(10), bm_b = runif(10), val_b = runif(10)) # 批量生成rel_*列:rel_后缀 = val_后缀 - bm_后缀 df <- df |> mutate( across( .cols = starts_with("val_"), # 选中所有以val_开头的列 .fns = ~ .x - pick(paste0("bm_", sub("val_", "", cur_column()))), # 计算对应bm列的差值 .names = "rel_{sub('val_', '', .col)}" # 定义新列的命名规则 ) )
代码说明
starts_with("val_"):精准筛选所有以val_为前缀的列,适配任意数量的同类列(比如新增val_c、val_d也能自动识别)sub("val_", "", cur_column()):从当前处理的val_*列名中提取后缀(比如从val_a提取a)pick(paste0("bm_", ...)):根据后缀匹配对应的bm_*列,确保计算的是同一后缀的列对.names参数:通过模板字符串自动生成新列名,格式为rel_+原后缀,保证命名一致性
验证结果
运行后生成的df会包含所有自动创建的rel_a、rel_b(以及后续新增后缀对应的rel_*列),结果和手动逐个定义的完全一致。
内容的提问来源于stack exchange,提问作者Chechy Levas
相关产品推荐
相关产品推荐

