dplyr中`across(everything(), ...)`是否有简洁替代写法?
替代
across(everything(), ...)的简洁写法(批量应用多函数) 以下是几种不同工具链的解决方案,覆盖dplyr及其他常用R工具:
dplyr 环境下的写法
dplyr 1.1.0后要求across()必须明确指定.cols参数,你提供的across(everything(), lst(min, max))已经是该框架下的简洁写法(.cols是across()的第一个参数,可省略参数名)。完整实现代码:
library(dplyr) mtcars |> summarize(across(everything(), lst(min, max))) |> pivot_longer(everything(), names_to = c("var", ".value"), names_sep = "_")
若暂时不介意使用已弃用函数,summarize_all()写法更短,但官方不推荐长期依赖:
mtcars |> summarize_all(lst(min, max)) |> pivot_longer(everything(), names_to = c("var", ".value"), names_sep = "_")
data.table 高效写法
data.table语法更紧凑,无需额外转置步骤即可生成目标格式:
library(data.table) setDT(mtcars)[, lapply(.SD, \(x) .(min = min(x), max = max(x)))] |> melt() |> dcast(L1 ~ value2, value.var = "value")
base R 原生实现
无需加载任何扩展包,通过sapply()直接生成结果矩阵再整理:
sapply(mtcars, \(x) c(min = min(x), max = max(x))) |> t() |> data.frame(var = rownames(.), check.names = FALSE) |> subset(select = c(var, min, max))
purrr 函数式写法
结合purrr的map_dfr()可一步生成目标tibble:
library(purrr) mtcars |> map_dfr(\(x) data.frame(min = min(x), max = max(x)), .id = "var")
内容的提问来源于stack exchange,提问作者Rico
相关产品推荐
相关产品推荐

