如何用dplyr::across批量计算同前缀两列的差值?
使用dplyr的across批量计算分组差值的正确方法
首先,原始数据框定义如下:
zed <- data.frame( aAgg = c(5, 10, 15, 20), bAgg = c(8, 16, 24, 32), aPg = c(6, 9, 11, 24), bPg = c(7, 15, 22, 26) )
需求是批量针对前缀a和b,计算prefixAgg减去prefixPg的差值,生成新列prefixDiff,替代多次调用mutate的繁琐写法。
正确实现代码
利用across结合字符串操作关联对应列,同时通过.names参数指定新列名:
library(dplyr) library(stringr) zed <- zed %>% mutate( across( ends_with("Agg"), # 选中所有以Agg结尾的列 ~ .x - get(str_replace(cur_column(), "Agg", "Pg")), # 匹配对应Pg列并计算差值 .names = "{str_remove(.col, 'Agg')}Diff" # 生成prefixDiff格式的新列名 ) )
代码说明
ends_with("Agg"):精准筛选出需要计算差值的*Agg列;cur_column():获取当前处理的列名,通过str_replace将后缀"Agg"替换为"Pg",再用get()取出对应的*Pg列完成减法运算;.names参数:通过字符串模板生成目标列名,去掉原列名的"Agg"后缀后拼接"Diff",直接得到aDiff、bDiff这类符合要求的列名。
运行后得到的zed数据框包含的aDiff和bDiff列,结果与多次调用mutate的输出完全一致。
内容的提问来源于stack exchange,提问作者Canovice
相关产品推荐
相关产品推荐

