You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 14:25:22