R tidyverse中case_when函数问题排查:生成season仅2层级而非预期4个
case_when仅返回2类的问题原因与修复方案
核心错误原因
你误用了逻辑运算符,将区间判断需要的逻辑与(&)写为了逻辑或(|),同时对case_when的判断顺序规则理解不到位。
case_when运行规则
case_when会按照你写的条件顺序从上到下逐一匹配,只要某行数据满足了靠前的某条条件,就会直接使用该条件对应的赋值,不再校验后续所有条件。
你的代码问题拆解
- 第一条条件
day <= 60 | day > 335可以正确匹配到全年两端的冬季区间,这部分数据会被正确赋值为winter。 - 剩余所有数据的day值范围是61~335,到第二条条件
day > 60 | day <= 151时,由于逻辑或只要一边成立整体就成立,所有61~335的day都满足day>60,因此全部命中第二条条件被赋值为spring,后面的summer、autumn条件永远不会被触发,所以最终只能得到2个分类。
修复后的代码
把后三个区间判断的逻辑运算符从|替换为&即可,冬季的两个不连续区间用|是正确的:
data <- tibble(day = 1:366) %>% mutate( season = case_when( day <= 60 | day > 335 ~ "winter", day > 60 & day <= 151 ~ "spring", day > 151 & day <= 242 ~ "summer", day > 242 & day <= 335 ~ "autumn" ) )
运行table(data$season)即可看到4个分类的统计结果,符合预期。
内容的提问来源于stack exchange,提问作者Raed Hamed
相关产品推荐
相关产品推荐

