如何在dplyr 1.1.0中使用across()调用带共享参数的函数列表
使用模拟数据和函数快速设置
- 加载dplyr包
library(dplyr) - 创建单列数据框
data <- data.frame(a = 1:5) - 定义两个自定义函数
newfun1 <- function(x, val) {x + val} newfun2 <- function(x, val) {x * val} - 将函数存储为命名列表
usefuns <- stats::setNames(as.list(c(newfun1, newfun2)), c("fun1", "fun2"))
需求目标
将usefuns中的每个函数应用到data的a列,统一指定val参数为100
旧版本(dplyr < 1.1.0)实现方式
直接通过across()的...参数传递公共参数即可:
data %>% mutate(across(.col = a, .fns = usefuns, val = 100))
dplyr 1.1.0+的兼容性问题
升级到dplyr 1.1.0及以上版本后,会收到以下警告:
自dplyr 1.1.0起,
across()的...参数已被弃用。请通过匿名函数直接向.fns传递参数。
#旧写法across(a:b, mean, na.rm = TRUE)
#新写法across(a:b, ~mean(x, na.rm = TRUE))
已找到的可行写法
# 直接调用函数 data %>% mutate(across(.col = a, .fns = list(fun1 = ~newfun1(.x, val = 100), fun2 = ~newfun2(.x, val = 100)))) # 从命名列表调用 data %>% mutate(across(.col = a, .fns = list(fun1 = ~usefuns$fun1(.x, val = 100), fun2 = ~usefuns$fun2(.x, val = 100))))
但以上写法不够简洁——实际场景中usefuns的函数数量不固定,且可能有更多公共参数,每次都逐个写匿名函数效率太低。
补充场景
val参数值可能随应用场景变化,比如多列数据框:
data <- data.frame(a = 1:5, b = 6:10, c = 11:15)
在旧版本中可以这样批量处理:
data %>% mutate(across(.col = c(a, b), .fns = usefuns, val = 100), across(.col = c, .fns = usefuns, val = 200))
试过多种函数列表的调用方式,也尝试过purrr但效果不理想,想知道是否可以用partial()简化操作,以及具体用法。
内容的提问来源于stack exchange,提问作者Danielle Quinn
相关产品推荐
相关产品推荐

