R语言left_join合并数据集时出现意外NA值问题咨询
问题排查结论
匹配出现NA的核心原因是两个数据集的join键(州名+县名)没有做对齐,主要踩了三个文本清洗的坑:
- 只删除了县名里的
County后缀,没覆盖美国其他州的县级行政单位称谓:路易斯安那州的县级单位叫Parish,阿拉斯加州的县级单位叫Borough/Census Area,还有30多个独立市带city/municipality后缀,这些条目没做替换就完全匹配不上。 - 替换后缀后没处理残留空格:用
gsub("County", "", county)处理后,原后缀位置会留下多余的尾空格,比如"ada county"处理完变成"ada ",和map_data里无尾空格的"ada"字符串不相等,直接匹配失败。 - 少部分特殊县名存在编码/写法差异:
maps包的地理数据会自动把带重音符号的县名转成纯ASCII格式,部分多词县名的空格、连字符规则和fips_codes里的写法有细微差别。
修复方案
先调整县名清洗逻辑,把所有后缀统一删掉,再用str_squish()清除多余空格,正式join前先用反连接检查未匹配条目,确认没问题再全量合并:
library(tidyverse) library(tidycensus) library(lubridate) library(maps) drought_fips <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2022/2022-06-14/drought-fips.csv') counties_geodata <- map_data("county") data("fips_codes") fips_codes_clean <- fips_codes %>% mutate( across(c(county, state_name), str_to_lower), # 批量移除字符串末尾的所有县级单位后缀,避免误删县名本身包含的关键词 county = str_remove_all(county, "\\s(county|parish|borough|census area|city|municipality)$"), # 清除所有首尾空格、中间多余空格 county = str_squish(county) ) # 先排查未匹配项 unmatched_entries <- counties_geodata %>% anti_join(fips_codes_clean, by = c("region" = "state_name", "subregion" = "county")) # 打印unmatched_entries就能看到剩余没匹配上的特殊条目,单独调整规则即可 # 确认无异常后完成合并 counties <- counties_geodata %>% left_join(fips_codes_clean, by = c("region" = "state_name", "subregion" = "county"))
排查技巧
以后做文本字段的join,不要合并完再看NA,先跑anti_join()把左表里匹配不上的行单独捞出来,直接看哪些值没对上,比对着调整清洗规则效率高很多。按上面的逻辑处理后,99%以上的县都能正常匹配,剩下的极个别特殊条目(比如个别独立市、离岛区域)单独做名称映射即可。
内容的提问来源于stack exchange,提问作者mzkrc
相关产品推荐
相关产品推荐

