使用dplyr嵌套ifelse生成区域列结果异常的问题排查
问题分析与解决方案
我一眼就看出你的多层ifelse里的条件逻辑出问题啦!咱们来一步步拆解:
问题根源
第一个ifelse已经处理了cood < 3750023.25的情况,能进入第二个ifelse的所有行,必然满足cood >= 3750023.25。但你第二个条件写的是:
3750023.25 >= cood & cood < 3759048.50
这里的3750023.25 >= cood和前置条件完全矛盾,这个条件永远不会为真!所以所有本该属于Area 2的行都会直接跳过第二个判断,进到第三个ifelse里——这就是为什么cood=3751013会被错误标记为Area 3的原因。
修正后的ifelse代码
你只需要把条件里的下限判断调整为正确的方向,同时还可以简化后续条件(因为前面的判断已经过滤掉了更小的值):
train = train %>% mutate(area = ifelse(cood < 3750023.25, 'Area 1', ifelse(cood < 3759048.50, 'Area 2', ifelse(cood < 3768073.75, 'Area 3', ifelse(cood >= 3768073.75, 'Area 4', NA)))))
更推荐的写法:用case_when替代多层ifelse
dplyr的case_when专门用来处理这种多条件分支,可读性远高于多层嵌套的ifelse,逻辑也更清晰(按顺序判断,前面条件满足后就不会执行后续判断):
train = train %>% mutate(area = case_when( cood < 3750023.25 ~ 'Area 1', cood < 3759048.50 ~ 'Area 2', cood < 3768073.75 ~ 'Area 3', cood >= 3768073.75 ~ 'Area 4', TRUE ~ NA_character_ # 处理所有未匹配的情况 ))
这样写不仅不容易出错,后续维护和修改范围值也会方便很多~
内容的提问来源于stack exchange,提问作者principe
相关产品推荐
相关产品推荐

