如何向dplyr函数传递多个group_by参数与动态变量参数
解决dplyr函数中动态传递分组列与计算列的问题
最近写自定义函数用dplyr做分组分位数计算时,踩了个小坑:直接把列名作为参数传给函数,dplyr根本识别不了。后来查了资料,用上quosure(准引用)这套机制就完美解决了,分享下我的实现思路和代码:
核心逻辑就是利用enquo()捕获传入的列参数,转换成quosure对象,再用!!(解引用操作符)在dplyr函数里把它“还原”成实际的列。这样不管是分组列还是要计算分位数的列,都能动态传递了。
先上能正常运行的基础版本代码:
quantileMaker2 <- function(data, groupCol, calcCol) { # 将传入的列参数转换成quosure groupCol <- enquo(groupCol) calcCol <- enquo(calcCol) data %>% group_by(!! groupCol) %>% summarise( '25%' = currency(quantile(!! calcCol, probs = 0.25, na.rm = TRUE), digits = 2L), '50%' = currency(quantile(!! calcCol, probs = 0.5, na.rm = TRUE), digits = 2L), '75%' = currency(quantile(!! calcCol, probs = 0.75, na.rm = TRUE), digits = 2L) ) }
如果需要支持多个分组列的话,还可以扩展成下面这样,用enquos()捕获多个参数,配合!!!解引用多个quosure:
quantileMakerMulti <- function(data, calcCol, ...) { # 捕获多个分组列参数 groupCols <- enquos(...) calcCol <- enquo(calcCol) data %>% # 解引用多个分组列 group_by(!!! groupCols) %>% summarise( '25%' = currency(quantile(!! calcCol, probs = 0.25, na.rm = TRUE), digits = 2L), '50%' = currency(quantile(!! calcCol, probs = 0.5, na.rm = TRUE), digits = 2L), '75%' = currency(quantile(!! calcCol, probs = 0.75, na.rm = TRUE), digits = 2L) ) }
简单说下关键函数的作用:
enquo():捕获单个参数的表达式(比如你传入的列名),并保留它的上下文,转换成quosure对象enquos():和enquo()类似,不过是用来捕获多个参数的!!:解引用单个quosure,让dplyr把它当作实际的列来处理!!!:解引用多个quosure,适用于需要传入多个参数的场景(比如多列分组)
内容的提问来源于stack exchange,提问作者robbieNukes
相关产品推荐
相关产品推荐

