如何在dplyr::summarize中为不同列批量匹配对应汇总函数?
解决dplyr按组汇总时每列应用对应不同函数的问题
你遇到的问题是across默认会把传入的所有函数应用到每一列,导致生成了远多于需求的汇总列。要实现每列仅对应查找表中指定的单个函数,可以用以下两种简洁方法:
方法1:利用cur_column()匹配对应函数
先把查找表转换为列名-函数的命名列表,再在across中通过cur_column()获取当前处理的列名,调用对应的函数:
library(dplyr) lookup_table <- tibble( variable = c('mpg', 'disp', 'hp', 'drat', 'wt', 'qsec', 'vs', 'am', 'gear', 'carb'), summ_fn = list(mean, max, min, sum, mean, mean, median, mean, sum, max) ) # 转换为列名映射到函数的命名列表 fn_mapping <- setNames(lookup_table$summ_fn, lookup_table$variable) mtcars %>% group_by(cyl) %>% summarize( across(all_of(names(fn_mapping)), ~ fn_mapping[[cur_column()]](.x)), .groups = "drop" # 可选,取消分组状态 )
方法2:用purrr生成汇总表达式
如果习惯用表达式拼接的方式,可以借助purrr::map2生成每个列的汇总表达式,再通过!!!展开到summarize中:
library(dplyr) library(purrr) lookup_table <- tibble( variable = c('mpg', 'disp', 'hp', 'drat', 'wt', 'qsec', 'vs', 'am', 'gear', 'carb'), summ_fn = list(mean, max, min, sum, mean, mean, median, mean, sum, max) ) # 生成每个变量对应的汇总表达式 summ_expressions <- map2(lookup_table$variable, lookup_table$summ_fn, ~ expr(!!.y(!!sym(.x)))) mtcars %>% group_by(cyl) %>% summarize(!!!summ_expressions, .groups = "drop")
为什么原代码会生成100列?
原代码中.fns = lookup_table$summ_fn是把10个函数全部传入across,across的逻辑是对每一列应用所有传入的函数,因此10列×10个函数就生成了100个汇总列,这和你的需求不符。
内容的提问来源于stack exchange,提问作者qdread
相关产品推荐
相关产品推荐

