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

R语言数据框多Likert量表变量重编码报错,请求排查

解决Likert量表重编码的语法错误问题

嘿,我帮你排查到问题所在了——你写的代码里,不小心把funs(recode(...))塞进了mutate_at()的变量列表参数里,这就导致R把函数当成了变量名来识别,自然抛出了.vars must be a character/numeric vector...的错误。

下面给你几个可行的解决方案,从修正原有写法到更简洁的替代方案都有:

方案1:修正mutate_at的语法(兼容旧版dplyr)

先把变量列表和函数参数分开,同时修正recode的语法(注意旧值要用反引号包裹,不用写==),另外记得删掉你变量列表里重复的V15:

Newdata <- TPBdata %>% 
  mutate_at(
    .vars = c("V5","V6", "V7", "V8", "V9", "V10", "V11", "V12", "V13", "V15", "V15_b", "V15_a", "V15_eco", "V18", "V19", "V20", "V21", "V24", "V26", "V25", "V22"),
    .funs = ~ recode(., `7` = 1, `6` = 2, `5` = 3, `4` = 4, `3` = 5, `2` = 6, `1` = 7, .default = NA_real_)
  )

这里用NA_real_替代NaN,更符合R里数值型缺失值的规范。

方案2:用现代版dplyr的across函数(推荐)

从dplyr 1.0.0版本开始,官方推荐用across替代mutate_at这类函数,语法更清晰:

Newdata <- TPBdata %>% 
  mutate(
    across(
      .cols = c("V5","V6", "V7", "V8", "V9", "V10", "V11", "V12", "V13", "V15", "V15_b", "V15_a", "V15_eco", "V18", "V19", "V20", "V21", "V24", "V26", "V25", "V22"),
      .fns = ~ recode(., `7` = 1, `6` = 2, `5` = 3, `4` = 4, `3` = 5, `2` = 6, `1` = 7, .default = NA_real_)
    )
  )

方案3:更简洁的反转计算(强烈推荐)

其实1-7的Likert量表反转,根本不用写一堆recode规则,直接用8 - 原变量值就可以实现:

  • 1 → 8-1=7
  • 7 → 8-7=1
  • 中间的4 → 8-4=4,完全符合你的需求

代码也更简洁,出错概率更低:

Newdata <- TPBdata %>% 
  mutate(
    across(
      .cols = c("V5","V6", "V7", "V8", "V9", "V10", "V11", "V12", "V13", "V15", "V15_b", "V15_a", "V15_eco", "V18", "V19", "V20", "V21", "V24", "V26", "V25", "V22"),
      .fns = ~ 8 - .x
    )
  )

如果你的变量是因子型,记得先转成数值型再计算:

.fns = ~ 8 - as.numeric(as.character(.x))

内容的提问来源于stack exchange,提问作者Tooba

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 07:42:40