在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
相关产品推荐
相关产品推荐

