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
相关产品推荐
相关产品推荐

