如何正确编写链式ifelse语句实现城市编码重新分组?
问题原因
- 逻辑运算符使用错误:
==在R中是逐元素对等比较,当你用region == c(11,31)时,R会把c(11,31)循环重复到和region列长度一致,再逐位置匹配,只有region第奇数位等于11、第偶数位等于31时才会返回TRUE,绝大多数场景下31都不会命中这个条件,自然不会被修改。要判断单个值是否属于目标向量的成员,应该用%in%运算符。 - 规则匹配和需求不一致:你需要的是11与12合并为111、21与22合并为222,但现有代码完全没有涉及12、21、22的判断逻辑,反而额外增加了31、27、33、34的处理规则,和你的需求完全不匹配。
- 兜底值逻辑问题:现有代码的兜底分支直接返回原
region2列的值,如果原region2列本身就存在31,且对应行的region没有命中前面的两个判断条件,31就会被直接保留下来。
修复方案
方案1:使用dplyr::case_when实现(可读性更高,更易扩展)
library(dplyr) merged <- merged %>% mutate(region2 = case_when( # 匹配需求规则:11、12合并为111 region %in% c(11, 12) ~ 111, # 匹配需求规则:21、22合并为222 region %in% c(21, 22) ~ 222, # 你原代码中需要的其他规则可以在这里补充,比如: # region %in% c(31) ~ 111, # region %in% c(33,34) ~ 27, # 兜底逻辑,不需要修改的编码保留原始值,可根据你的需求调整为region2 TRUE ~ region ))
方案2:沿用ifelse写法修复
merged <- merged %>% mutate(region2 = ifelse(region %in% c(11, 12), 111, ifelse(region %in% c(21, 22), 222, region)))
如果需要同时保留你原代码中对31、27、33、34的处理,可直接扩展判断逻辑即可。
内容的提问来源于stack exchange,提问作者SJ P
相关产品推荐
相关产品推荐

