如何在dplyr的across中为多列匹配对应参数?
dplyr across多列应用同一函数时,按列匹配参数的简洁写法
需求背景
已知dplyr的across常用范式是「多列、单函数」,现在需要给不同列应用同一函数,但每个列对应的参数不同。目前通过cur_column()结合过滤参数表的方式实现了需求,但这种写法需要逐个匹配列名取参数,不够简洁,希望找到更高效的写法。
原实现代码
library(dplyr) df = data.frame(column1 = 1:100, column2 = 1:100) parameters = data.frame( column_names = c('column1','column2'), parameters = c(10,100)) custom_function = function(x, addend){ x + addend } df2 = df %>% mutate( across(parameters$column_names, ~custom_function(., addend = parameters %>% filter(column_names == cur_column()) %>% pull(parameters))))
简洁解决方案
将参数表转换为命名向量,用列名作为向量名称,这样在across中可以直接通过cur_column()快速匹配对应参数,避免冗余的过滤操作:
library(dplyr) df = data.frame(column1 = 1:100, column2 = 1:100) parameters = data.frame( column_names = c('column1','column2'), parameters = c(10,100)) custom_function = function(x, addend){ x + addend } # 转换为命名参数向量,列名与参数一一对应 param_vec = set_names(parameters$parameters, parameters$column_names) df2 = df %>% mutate(across(all_of(parameters$column_names), ~custom_function(., addend = param_vec[cur_column()])))
补充说明
- 命名向量的方式更鲁棒:即使后续列的顺序变化,只要列名匹配就能正确取到参数,避免了依赖列顺序的潜在问题。
- 如果能确保
parameters$column_names的顺序和across选中的列顺序完全一致,也可以用以下简化写法(但鲁棒性较差,不推荐):df2 = df %>% mutate(across(parameters$column_names, ~custom_function(., addend = parameters$parameters[match(cur_column(), parameters$column_names)])))
内容的提问来源于stack exchange,提问作者tyler.reed
相关产品推荐
相关产品推荐

