You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确编写链式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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 21:45:02