dplyr 1.1.0中across()如何批量调用带数据列参数的函数列表?
在dplyr 1.1.0+中使用across()应用带额外列参数的函数列表
针对dplyr 1.1.0弃用across()的...参数后,无法直接给函数列表传递数据框列参数的问题,以下是几种可行的解决方案:
方法1:在across内部结合map_dfc调用函数列表
无需提前修改函数列表,直接在across()的匿名函数中用purrr::map_dfc遍历函数列表,同时传入当前列和目标列:
library(dplyr) library(purrr) df <- tibble(x = c(1,2), y = c(3, 4)) fns <- list(minus_y = function(x,y) x - y, plus_y = function(x,y) x + y) # 正确实现 df %>% mutate(across(x, \(col) map_dfc(fns, \(fn) fn(col, y))))
运行结果:
# A tibble: 2 × 4 x y x_minus_y x_plus_y <dbl> <dbl> <dbl> <dbl> 1 1 3 -2 4 2 2 4 -2 6
原理:map_dfc将每个函数的计算结果转换为数据框列并横向合并,across()自动为生成的列添加原变量名前缀(如x_)。
方法2:提前包装函数列表为绑定y参数的匿名函数
如果需要重复使用处理后的函数列表,可提前用purrr::map将每个函数包装成仅接受当前列的匿名函数,内部绑定数据框的y列:
# 预处理函数列表 fns_with_y <- map(fns, \(fn) \(col) fn(col, df$y)) df %>% mutate(across(x, fns_with_y))
此方法适合需要多次复用同一函数列表的场景。
方法3:结合purrr::partial解决作用域问题
之前使用partial报错是因为作用域问题,将partial放在across的匿名函数内部,让y在mutate的环境中可见即可:
df %>% mutate(across(x, \(col) map_dfc(fns, partial, y = y)))
partial会将当前环境中的y列绑定到每个函数的参数上,避免“object 'y' not found”错误。
内容的提问来源于stack exchange,提问作者itch987
相关产品推荐
相关产品推荐

