R语言Tidy Eval问题:mutate生成列无法传入group_by
解决dplyr动态列名在group_by中的引用问题
问题根源
你编写的summary_w2_fn函数中,group_by(wave, "{{w3_name}}_{suffix}")这一行存在核心问题:这里的字符串"{{w3_name}}_{suffix}"会被dplyr当作字面列名处理,不会解析其中的动态表达式,因此无法识别mutate阶段生成的拼接列。
修正后的函数方案
我们可以先将动态生成的列名提前定义为变量,再通过sym()和!!(强制解引用)语法,让dplyr正确识别这个动态列名:
library(dplyr) library(glue) summary_w2_fn <- function(df, w2_name, w3_name, suffix = "recoded") { # 生成动态列名字符串 recoded_col <- glue("{as_name(enquo(w3_name))}_{suffix}") df %>% rename({{w3_name}} := {{w2_name}}) %>% count(wave, {{w3_name}}) %>% drop_na() %>% mutate({{recoded_col}} := recoding_1_fn({{w3_name}})) %>% group_by(wave, !!sym(recoded_col)) %>% # 引用动态生成的列 summarise(n = sum(n)) %>% rename({{w3_name}} := !!sym(recoded_col)) # 重命名时同样引用动态列 }
额外优化点
原recoding_1_fn中TRUE ~ NA可能触发类型不一致警告,建议明确指定字符型NA以统一返回类型:
recoding_1_fn <- function(var_name) { case_when( var_name %in% c(1, 2, 3, 6) ~ "disagree", var_name %in% c(4, 5) ~ "agree", TRUE ~ NA_character_ # 指定字符型NA,避免类型警告 ) }
测试调用
执行以下代码即可得到正确的分组汇总结果:
set.seed(42) w2_test <- data.frame(id=1:607, wave = "W2", tech =floor(runif(607, 1, 6))) summary_w2_fn(w2_test, tech, W3_SUS_4)
内容的提问来源于stack exchange,提问作者Alex Braga
相关产品推荐
相关产品推荐

