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

在dplyr的mutate across中能否编程式使用非引用配对列?

使用mutate across批量计算配对列的和

完全可以用mutate(across())实现需求,不用借助pivot操作。

原代码问题分析

你写的代码失效的原因是:在匿名函数里用!!rlang::sym(paste0(cur_column(), "_var"))时,cur_column()的求值时机和!!的展开时机不匹配,导致无法正确定位到对应的_var列。

正确实现方式

这里提供几种可行的写法:

方法1:使用.data代词(推荐)

利用dplyr的.data代词安全引用数据框内的列,结合cur_column()获取当前处理的列名:

dt %>%
  mutate(across(c(x, y, z), 
                ~ .x + .data[[paste0(cur_column(), "_var")]],
                .names = "{col}_sum"))

方法2:使用get()函数

通过get()根据列名字符串提取对应列的值:

dt %>%
  mutate(across(c(x, y, z), 
                ~ .x + get(paste0(cur_column(), "_var")),
                .names = "{col}_sum"))

方法3:提前定义主列向量(适合列名较多的场景)

如果主列数量多,可以先定义向量,再用all_of()传入:

main_cols <- c("x", "y", "z")
dt %>%
  mutate(across(all_of(main_cols),
                ~ .x + .data[[paste0(cur_column(), "_var")]],
                .names = "{col}_sum"))

结果验证

运行上述代码后,会新增x_sum、y_sum、z_sum三列,分别对应x+x_var、y+y_var、z+z_var的计算结果,示例输出如下:

# A tibble: 3 × 9
      x     y     z x_var y_var z_var x_sum y_sum z_sum
  <int> <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1     1     2     3   0.1   0.2   0.3   1.1   2.2   3.3
2     2     3     4   0.1   0.2   0.3   2.1   3.2   4.3
3     3     4     5   0.1   0.2   0.3   3.1   4.2   5.3

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 08:15:35