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

RStudio中如何通过近似正则匹配为非标准城市名关联对应城市编码

R+Tidyverse 城市名近似匹配实现方案

整体逻辑分3层执行,完全适配100个量级城市的匹配需求,无需引入复杂模糊匹配框架:

  • 拆解标准编码表的结构化字段,建立州名缩写-全称的映射关系
  • 对待匹配表的混乱城市名做标准化清洗,抹平格式差异
  • 通过核心城市名的精确关联匹配对应编码,最后做未匹配项的校验

第一步:加载依赖与构建示例数据

library(tidyverse)
# 待匹配的混乱城市表
city_table <- tibble(
  city = c("Austin", "Austin TX", "Austin Texas", "Austin, Texas", "Austin (city)",
           "Butte - Bozeman", "Butte-Bozeman", "Butte-Bozeman MT", "Butte-Bozeman, Montana", "Butte - Bozeman, Montana")
)
# 标准城市编码表
city_code <- tibble(
  city_code = c("001", "002"),
  city_name = c("Austin,TX", "Butte-Bozeman,MT")
)

第二步:预处理标准映射表

拆分标准编码表的固定格式(城市名,州缩写),同时建立州全称和缩写的对应关系,为后续清洗做准备:

# 拆分标准城市名
city_code_clean <- city_code %>%
  separate(city_name, into = c("core_city", "state_abbr"), sep = ",", remove = FALSE)

# 建立州全称-缩写映射表(可根据实际覆盖的城市补充条目)
state_map <- tibble(
  state_full = c("Texas", "Montana"),
  state_abbr = c("TX", "MT")
)

第三步:标准化清洗待匹配城市名

所有清洗规则针对业务中常见的格式乱序问题设计:

  • 移除括号内的冗余标注(如“(city)”这类备注)
  • 统一连字符、逗号前后的多余空格(如“Butte - Bozeman”规整为“Butte-Bozeman”)
  • 识别文本末尾的州全称/缩写,统一替换为标准格式
  • 提取核心城市名作为匹配依据
city_table_clean <- city_table %>%
  # 移除括号及内部所有内容
  mutate(city_clean = str_remove_all(city, "\\(.*?\\)")) %>%
  # 统一连字符前后的多余空格
  mutate(city_clean = str_replace_all(city_clean, "\\s*-\\s*", "-")) %>%
  # 统一逗号前后的多余空格
  mutate(city_clean = str_replace_all(city_clean, "\\s*,\\s*", ",")) %>%
  # 去除字符串首尾空格
  mutate(city_clean = str_trim(city_clean)) %>%
  # 逐行处理州名的标准化替换
  rowwise() %>%
  mutate(city_clean = {
    clean_str <- city_clean
    for (i in seq_len(nrow(state_map))) {
      sfx <- state_map$state_full[i]
      sabbr <- state_map$state_abbr[i]
      # 替换逗号分隔的州全称:如"Austin, Texas" -> "Austin,TX"
      clean_str <- str_replace(clean_str, str_c(",", sfx, "$"), str_c(",", sabbr))
      # 替换空格分隔的州全称/缩写:如"Austin TX"、"Austin Texas" -> "Austin,TX"
      clean_str <- str_replace(clean_str, str_c("\\s+", sfx, "$"), str_c(",", sabbr))
      clean_str <- str_replace(clean_str, str_c("\\s+", sabbr, "$"), str_c(",", sabbr))
    }
    clean_str
  }) %>%
  ungroup() %>%
  # 提取核心城市名(去掉末尾的州标记)
  mutate(core_city_clean = str_remove(city_clean, ",.*$"))

第四步:关联匹配城市编码

通过标准化后的核心城市名,关联标准编码表,生成最终结果:

final_result <- city_table_clean %>%
  left_join(city_code_clean %>% select(core_city, city_code),
            by = c("core_city_clean" = "core_city")) %>%
  # 保留原始城市名和匹配到的编码
  select(city, city_code)

实际业务适配提示

  • 匹配完成后可单独筛选city_code为空的行,这些是未匹配的异常格式,只要补充对应的正则规则、或者手动补充映射关系即可,100个城市规模下校验工作量极低
  • 核心城市名保留原生格式(如带空格的“New York”、带连字符的“Butte-Bozeman”),仅对末尾的州标记做格式规整,不会破坏城市名本身的结构
  • 所有清洗逻辑都可灵活调整,遇到特殊格式只要在str_replace部分加对应的规则即可

内容的提问来源于stack exchange,提问作者DPatrick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 16:57:00