R语言mutate+case_when匹配向量创建新列报错解决方案
报错原因
- 你被错误提示误导了,问题和「对象长度不一致」无关。
%in%运算符不要求左右两侧向量长度相等,它会返回和左侧输入(即Analyte列,长度为6)等长的逻辑向量,长度完全匹配。 - 真实原因是
case_when()的硬性规则:所有条件分支右侧的返回值必须为相同数据类型。你的前两个分支返回字符型值"Class1"、"Class2",但兜底分支写的裸NA在R中默认是逻辑型(logical),两种类型无法拼接,触发了底层错误。旧版本dplyr对这类类型不匹配错误的提示设计有缺陷,才会抛出names属性长度不符这类迷惑性报错,新版本dplyr已经将提示优化为明确的类型不匹配说明。 - 额外存在一处笔误:你写的新列名
Analye_Class漏了字母t,和原有列名Analyte拼写不一致,虽不触发本次报错,但会导致最终列名不符合预期。
修正方法
将兜底分支的逻辑型缺失值NA替换为字符型缺失值NA_character_,保证所有分支返回值类型统一即可,修正后代码和你用within()实现的效果完全一致:
library(dplyr) Class1 <- c("a","b") Class2 <- c("c","d") df <- data.frame (Site = c("A","A","B","B","C","C"), Analyte = c("a","b","a","b","c","d"), Class = rep(c("NA"),6)) df2 <- df %>% mutate(Analyte_Class = case_when( Analyte %in% Class1 ~ "Class1", Analyte %in% Class2 ~ "Class2", TRUE ~ NA_character_ )) df2
运行输出结果:
Site Analyte Class Analyte_Class 1 A a NA Class1 2 A b NA Class1 3 B a NA Class1 4 B b NA Class1 5 C c NA Class2 6 C d NA Class2
补充说明
后续使用case_when()时如果分支返回其他类型值,兜底缺失值要对应使用类型匹配的NA:
- 返回数值型用
NA_real_ - 返回整数型用
NA_integer_ - 返回逻辑型可以直接用裸
NA
内容的提问来源于stack exchange,提问作者user11036517
相关产品推荐
相关产品推荐

