R语言合并空间多边形DataFrame生成Leaflet地图遇NA问题求助
解决GADM空间数据与统计DataFrame合并后字段NA问题并生成Leaflet交互式地图
1. 问题根源定位
合并后Mean_Rate等字段全为NA,核心原因是空间数据的NAME_1/NAME_2与统计数据的State/Geography没有匹配成功,常见触发场景:
- 大小写不一致(如GADM存"Los Angeles",你的数据是"los angeles")
- 州名格式差异(GADM用全称"California",你的数据用缩写"CA")
- 郡名后缀/别名差异(如GADM带"County"后缀,你的数据仅存郡名)
- 字符串含多余空格(如"San Diego " vs "San Diego")
匹配检查代码
先确认双方键值的差异:
# 提取GADM中的加州数据 gadm_ca <- subset(gadm_data, NAME_1 == "California") # 对比双方键值 head(gadm_ca[, c("NAME_1", "NAME_2")]) head(your_data[, c("State", "Geography")]) # 找出完全不匹配的项 setdiff(gadm_ca$NAME_2, your_data$Geography) # GADM有但统计数据无的郡名 setdiff(your_data$Geography, gadm_ca$NAME_2) # 统计数据有但GADM无的郡名
2. 清洗合并键,统一格式
根据检查结果,对键值做标准化处理:
library(stringr) # 统一大小写 your_data$State <- toupper(your_data$State) gadm_ca$NAME_1 <- toupper(gadm_ca$NAME_1) your_data$Geography <- str_to_title(your_data$Geography) gadm_ca$NAME_2 <- str_to_title(gadm_ca$NAME_2) # 去除首尾空格 your_data$Geography <- trimws(your_data$Geography) gadm_ca$NAME_2 <- trimws(gadm_ca$NAME_2) # 州名缩写转全称(如果你的数据用缩写) state_map <- c("CA" = "CALIFORNIA") your_data$State <- recode(your_data$State, !!!state_map) # 给统计数据的郡名补全"County"后缀(如果GADM带后缀) your_data$Geography <- paste0(your_data$Geography, " County")
3. 重新执行空间合并
推荐使用sf包(当前空间数据处理的主流工具,比sp更易用):
library(sf) # 转换GADM数据为sf格式 gadm_ca_sf <- st_as_sf(gadm_ca) # 执行合并 merged_sf <- merge(gadm_ca_sf, your_data, by.x = c("NAME_1", "NAME_2"), by.y = c("State", "Geography"))
如果坚持用sp包:
merged_sp <- sp::merge(gadm_ca, your_data, by.x = c("NAME_1", "NAME_2"), by.y = c("State", "Geography"))
4. 生成Leaflet交互式地图
基于合并后的sf对象,生成带指标弹窗的交互式地图:
library(leaflet) library(RColorBrewer) # 定义颜色渐变方案 pal <- colorNumeric(palette = "YlOrRd", domain = merged_sf$Mean_Rate) # 构建地图 leaflet(merged_sf) %>% addTiles() %>% # 添加默认底图 addPolygons( fillColor = ~pal(Mean_Rate), fillOpacity = 0.7, color = "#BDBDC3", weight = 1, popup = ~paste0( "<strong>郡名:</strong> ", NAME_2, "<br>", "<strong>平均比率:</strong> ", round(Mean_Rate, 2), "<br>", "<strong>分子均值:</strong> ", Mean_Numerator, "<br>", "<strong>分母均值:</strong> ", Mean_Denominator ) ) %>% addLegend( pal = pal, values = ~Mean_Rate, title = "Mean Rate", position = "bottomright" )
额外提示
- 如果仍有少量NA,说明存在个别郡名别名差异,手动添加映射规则即可
- 确保
getData获取的GADM数据为最新版本,避免行政区划变更导致的不匹配 - sf包支持更多现代空间数据操作,建议逐步迁移到sf生态
内容的提问来源于stack exchange,提问作者firmo23
相关产品推荐
相关产品推荐

