You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:20:45