如何使用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)
关键逻辑说明
- 列拆分:用
str_subset自动区分主列(不含_Q后缀)和Q列(含_Q后缀),无需手动指定列名,适配列名变动场景。 - 滞后列生成:通过
across的list参数一次性生成L1/L2/L3滞后列,用{.col}_{.fn}动态命名,保证列名清晰易读。 - glue动态配对:
- 对每个主列(含滞后列),用字符串处理函数提取主列名和滞后后缀
- 用
glue构造对应的Q列名(如col1_L1对应col1_Q_L1) - 用
get()将构造出的列名字符串转为实际列值,传入my_function完成计算 - 用
{.col}_prod为结果列动态命名,方便后续识别
内容的提问来源于stack exchange,提问作者user113156
相关产品推荐
相关产品推荐

