使用ifelse()从两个因子向量生成四水平新因子未返回预期值
问题原因与解决办法
你的问题出在大小写不匹配:
- 数据集中
Canal因子的标签是"No canal"(注意canal是小写c) - 但你最后一个
ifelse条件里写的是Canal == "No Canal"(大写C)
R中字符串/因子的比较严格区分大小写,所以这个条件永远不成立,所有本该匹配"Neither"的情况都会走到else分支,返回"perdition"。当你调换yes和no的内容时,虽然条件还是不成立,但else返回的是"Neither",刚好符合预期,但这是巧合,不是正确的解决方式。
修正后的代码
把最后一个条件里的"No Canal"改成"No canal"即可:
arf$QEWcanal <- with(arf, ifelse((Canal == "Canal" & QEW == "QEW"), "Both", ifelse((Canal == "No canal" & QEW == "QEW"), "QEW only", ifelse((Canal == "Canal" & QEW == "No QEW"), "Canal only", ifelse((Canal == "No canal" & QEW == "No QEW"), "Neither", "perdition")))))
更简洁的替代写法
多层嵌套ifelse可读性差、易出错,推荐两种更高效的写法:
方法1:用case_when(需加载dplyr包)
library(dplyr) arf <- arf %>% mutate(QEWcanal = case_when( Canal == "Canal" & QEW == "QEW" ~ "Both", Canal == "No canal" & QEW == "QEW" ~ "QEW only", Canal == "Canal" & QEW == "No QEW" ~ "Canal only", TRUE ~ "Neither" # 剩余所有情况自动匹配 ))
方法2:用interaction函数
因为Canal和QEW都是二分类变量,直接组合它们的水平后重命名即可:
arf$QEWcanal <- interaction(arf$Canal, arf$QEW, sep = "_") # 重命名水平对应到需求的标签 levels(arf$QEWcanal) <- c("Both", "Canal only", "QEW only", "Neither")
内容的提问来源于stack exchange,提问作者Jeff Boggs
相关产品推荐
相关产品推荐

