如何在R中基于2015年犯罪率为俄罗斯区域地图着色?含名称匹配问题
解决GADM地图数据与俄联邦统计局犯罪率数据的名称匹配问题
这确实是地理数据可视化里非常常见的坑——不同数据源的行政区划名称总有各种差异:比如俄文/英文翻译变体、官方简称vs全称、甚至近年行政区划调整导致的名称变化。下面给你一套实操性强的解决流程:
1. 先明确两边的名称差异类型
首先你得把两边的名称都列出来,搞清楚到底是哪类不匹配:
- 查看GADM数据里的区域名称(注意GADM的俄罗斯数据通常有俄文名称列
NAME_1_RU,优先用这个和统计局的俄文名称匹配):
# 查看GADM的区域名称(俄文+英文) head(data@data[, c("NAME_1", "NAME_1_RU")]) # 列出所有GADM区域名称 unique(data@data$NAME_1_RU)
- 查看你从Word文档提取的犯罪率数据里的区域名称:
# 假设你的犯罪率数据框叫crime_data,区域名称列是region_name head(crime_data$region_name) unique(crime_data$region_name)
对比这两份列表,你就能发现差异:比如是“莫斯科市”vs“莫斯科”,还是英文译名和俄文原名的差异,或者是旧行政区划名称和新名称的区别。
2. 手动构建名称映射表(最可靠的方案)
因为官方统计数据和GADM的名称差异通常没有统一的自动匹配规则,手动映射是最不容易出错的方法:
# 创建一个映射表,左边是GADM里的俄文名称,右边是统计局数据里的对应名称 name_mapping <- data.frame( gadm_name = c("Москва", "Санкт-Петербург", "Республика Татарстан"), stats_name = c("г. Москва", "г. Санкт-Петербург", "Республика Татарстан"), stringsAsFactors = FALSE ) # 你需要把所有不匹配的区域都补充到这个表里
3. 合并映射表与你的犯罪率数据
先把映射关系关联到犯罪率数据上,这样就能和GADM的ID对应:
# 合并犯罪率数据和映射表 crime_data_mapped <- merge(crime_data, name_mapping, by.x = "region_name", by.y = "stats_name", all.x = TRUE)
4. 将犯罪率数据关联到GADM地理对象
现在把合并好的数据和GADM的空间数据框关联:
# 合并GADM数据和犯罪率数据 data_with_crime <- merge(data, crime_data_mapped, by.x = "NAME_1_RU", by.y = "gadm_name", all.x = TRUE)
这里all.x = TRUE是为了保留所有GADM的区域,哪怕有些区域没有犯罪率数据(后续可以用NA处理)。
5. 处理特殊情况
如果遇到行政区划合并/拆分的情况(比如某个旧区域被拆分到多个新区域,反之亦然),你需要:
- 如果是统计数据的区域比GADM大:把GADM的小区域数据聚合到统计数据的大区域
- 如果是统计数据的区域比GADM小:把统计数据的小区域数据汇总到GADM的大区域
可以用aggregate()函数或者dplyr的分组聚合来处理。
6. 验证并可视化
最后你可以用plot()或者tmap/ggplot2来验证匹配是否正确:
# 用raster包的plot快速验证 plot(data_with_crime, col = data_with_crime$crime_rate_2015) # 添加图例 legend("bottomright", legend = quantile(data_with_crime$crime_rate_2015, na.rm = TRUE), fill = terrain.colors(4), title = "2015 Crime Rate")
内容的提问来源于stack exchange,提问作者ArseniyW
相关产品推荐
相关产品推荐

