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

如何使用glue实现列对的mutate操作并向函数传递双列参数

用glue结合dplyr将对应列对传入自定义函数

问题场景

现有数据集包含col1/col2/col3三列,以及对应的col1_Q/col2_Q/col3_Q列;已通过dplyr::mutate(across)生成了所有列的L1、L2、L3滞后列。需要通过glue工具,将每一组对应列对(如col1与col1_Q、col1_L1与col1_Q_L1等)作为参数传入自定义函数my_function,并生成计算结果列。

原代码问题

原代码最后一步的mutate(across)存在两个核心问题:

  • 直接传入列名字符向量而非实际列值,无法完成数值运算
  • 未利用glue动态匹配对应列对,无法实现逐组列的配对计算

完整解决方案代码

library(tidyverse)

# 自定义函数:接收两个向量,返回逐元素乘积
my_function = function(var_1, var_2){
  var_1 * var_2
}

# 生成可复现的示例数据
set.seed(123)
data = data.frame(
  col1 = rnorm(10),
  col2 = rnorm(10),
  col3 = rnorm(10),
  
  col1_Q = rnorm(10),
  col2_Q = rnorm(10),
  col3_Q = rnorm(10)
)

# 步骤1:拆分主列与Q列,避免硬编码列名
main_cols = str_subset(colnames(data), "_Q$", negate = TRUE)
q_cols = str_subset(colnames(data), "_Q$")

# 步骤2:一次性生成所有列的L1/L2/L3滞后列(优化原多次mutate写法)
data_with_lags = data %>%
  mutate(across(all_of(c(main_cols, q_cols)), 
                list(L1 = ~lag(.x, 1), L2 = ~lag(.x, 2), L3 = ~lag(.x, 3)),
                .names = "{.col}_{.fn}"))

# 步骤3:用glue动态匹配列对,调用自定义函数生成结果列
final_data = data_with_lags %>%
  mutate(across(all_of(c(main_cols, str_subset(colnames(.), "^col\\d+_L\\d$"))), 
                ~my_function(.x, get(glue::glue("{str_remove(.col, '_L\\d+$')}_Q{str_extract(.col, '_L\\d+$')}"))),
                .names = "{.col}_prod"))

# 查看前6行结果
head(final_data)

关键逻辑说明

  1. 列拆分:用str_subset自动区分主列(不含_Q后缀)和Q列(含_Q后缀),无需手动指定列名,适配列名变动场景。
  2. 滞后列生成:通过across的list参数一次性生成L1/L2/L3滞后列,用{.col}_{.fn}动态命名,保证列名清晰易读。
  3. glue动态配对:
    • 对每个主列(含滞后列),用字符串处理函数提取主列名和滞后后缀
    • 用glue构造对应的Q列名(如col1_L1对应col1_Q_L1)
    • 用get()将构造出的列名字符串转为实际列值,传入my_function完成计算
    • 用{.col}_prod为结果列动态命名,方便后续识别

内容的提问来源于stack exchange,提问作者user113156

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 09:04:55