使用tidyeval将dplyr过滤分组汇总逻辑转为函数遇报错求助
问题分析与解决方案
错误原因
- 过滤条件逻辑错误:原函数中
filter(!!grup_poblacional, filtre)直接将传入的列名作为过滤条件,但该列是字符型而非逻辑型,导致报错“必须是逻辑向量而非字符向量”。实际需要的是列名等于过滤值的逻辑判断。 - 汇总变量未做tidyeval处理:
summarize(index_sumarise = mean(index_sumarise))中的index_sumarise未处理,会被当作字面量列名,而非用户传入的实际指标列。
修正后的函数(推荐curly-curly语法,dplyr官方推荐)
mitjana_index3 <- function(data, grup_poblacional, grup_territorial, index_sumarise, filtre){ data %>% filter({{ grup_poblacional }} == filtre) %>% group_by({{ grup_territorial }}) %>% summarize({{ index_sumarise }} := mean({{ index_sumarise }})) %>% arrange(desc({{ index_sumarise }})) }
旧版tidyeval写法(enquo+!!)
如果习惯使用早期tidyeval语法,也可以这样写:
mitjana_index3 <- function(data, grup_poblacional, grup_territorial, index_sumarise, filtre){ grup_poblacional <- enquo(grup_poblacional) grup_territorial <- enquo(grup_territorial) index_sumarise <- enquo(index_sumarise) data %>% filter(!!grup_poblacional == filtre) %>% group_by(!!grup_territorial) %>% summarize(!!index_sumarise := mean(!!index_sumarise)) %>% arrange(desc(!!index_sumarise)) }
核心修正点
- 过滤逻辑:将
!!grup_poblacional改为{{ grup_poblacional }} == filtre(或!!grup_poblacional == filtre),构造“列值等于过滤字符串”的逻辑向量,符合filter的要求。 - 动态列处理:用
{{ }}(或enquo+!!)包裹所有传入的列名参数,确保函数能正确识别用户传入的变量;用:=实现汇总列的动态命名,保证输出列名与传入的指标名一致。 - 排序逻辑:同样用
{{ }}引用汇总后的指标,确保降序排序的正确性。
调用方式(与原调用一致)
mitjana_index3(index_basic2_migpunts, Tramspoblacio_no_factor, ccaa, index_basic_estatal, "10000 - 19999")
内容的提问来源于stack exchange,提问作者FrancoBattiato
相关产品推荐
相关产品推荐

