如何用dplyr的across与purrr对多列执行指定运算
用dplyr::across批量处理多列的两个自定义运算
核心思路
借助dplyr::across函数指定目标列,通过命名列表定义两个运算逻辑,自动为每个原列生成对应的计算结果列。为了代码简洁,可先抽取重复的「计算最近4期滞后最大值」逻辑为辅助函数。
步骤1:定义辅助函数(可选但推荐)
把重复的滞后最大值计算抽成函数,提升代码可读性:
lag_max <- function(x) { pmax(lag(x), lag(x, 2), lag(x, 3), lag(x, 4), na.rm = TRUE) }
na.rm = TRUE用于处理开头几行的NA值,避免结果全为NA,可根据需求调整。
步骤2:批量处理目标列
使用across指定要处理的列(比如所有数值列、特定前缀列或指定列名),同时执行两个运算:
library(dplyr) # 替换.cols参数为你的目标列选择器: # - where(is.numeric): 处理所有数值列 # - starts_with("x"): 处理以x开头的列 # - c("colA", "colB"): 处理指定列名 df_processed <- df %>% mutate( across( .cols = where(is.numeric), .fns = list( # 第一个运算,新列后缀为_calc1 calc1 = ~ pmax(0, .x - lag_max(.x)), # 第二个运算,新列后缀为_calc2 calc2 = ~ pmax(0, -1 + .x / lag_max(.x)) ) ) )
无辅助函数的简化写法
如果不想单独定义函数,可直接把滞后最大值计算嵌入运算逻辑:
df_processed <- df %>% mutate( across( .cols = where(is.numeric), .fns = list( calc1 = ~ pmax(0, .x - pmax(lag(.x), lag(.x,2), lag(.x,3), lag(.x,4), na.rm = TRUE)), calc2 = ~ pmax(0, -1 + .x / pmax(lag(.x), lag(.x,2), lag(.x,3), lag(.x,4), na.rm = TRUE)) ) ) )
说明
- 最终生成的新列名为「原列名_运算后缀」,比如原列
x1会生成x1_calc1和x1_calc2 across本身已经整合了purrr的映射逻辑,无需额外调用purrr函数即可实现批量处理
内容的提问来源于stack exchange,提问作者Fef894
相关产品推荐
相关产品推荐

