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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 01:58:15