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
相关产品推荐
相关产品推荐

