使用mutate_at结合case_when时出现unexpected symbol错误求助
问题:数据框指定列分数转换代码报错
我有一个数据框df,需要对q_switch向量指定的列(如E1、E2、E3等)进行分数转换,转换规则为:5替换为1,4替换为2,2替换为4,1替换为5。尝试使用以下代码实现:
data%>% mutate_at( .vars = vars(q_switch), .funs = funs(. = case_when( . == 5 ~ 1 . == 4 ~ 2 . == 2 ~ 4 . == 1 ~ 5 )))
但运行时出现错误:
Error: unexpected symbol in: " . == 5 ~ 1 ."
请问我哪里出错了?
问题原因与修复方案
- 核心语法错误:
case_when中每个条件-结果对之间必须用逗号分隔,你漏掉了每一行末尾的逗号,导致R解析代码时无法识别后续的条件。 - 次要问题:代码里用的是
data,但你描述的是数据框df,需要保持名称一致;另外mutate_at是dplyr旧版语法,新版推荐使用mutate(across(...))写法,兼容性更好。
修正后的旧版语法代码
df %>% mutate_at( .vars = vars(q_switch), .funs = funs(. = case_when( . == 5 ~ 1, . == 4 ~ 2, . == 2 ~ 4, . == 1 ~ 5 )) )
推荐的新版dplyr语法(更清晰)
df %>% mutate(across(all_of(q_switch), ~ case_when( .x == 5 ~ 1, .x == 4 ~ 2, .x == 2 ~ 4, .x == 1 ~ 5 )))
注:如果q_switch是字符串向量(比如q_switch <- c("E1", "E2", "E3")),all_of()可以确保正确匹配列名;如果是直接的列引用,也可以去掉all_of()。
内容的提问来源于stack exchange,提问作者Maya
相关产品推荐
相关产品推荐

