合并美国普查空间数据与警察数据后非空间字段全为NA的求助
解决GEOID格式不匹配导致的空间数据与警察拦截数据合并问题
我太懂这种毕业论文卡数据合并的焦虑了!你已经精准揪出了问题核心:两个数据集的GEOID字段格式不统一——普查数据的GEOID带前导0,而你导出的警察数据GEOID缺失了前导0,这直接导致关联匹配失败,所以合并后警察相关变量全是NA。
下面是一步步的解决办法,亲测能搞定这个问题:
步骤1:统一GEOID的字符格式
GEOID是地理编码,属于字符串类型,不能当数值处理。我们要把两个数据集的GEOID都转换成带完整前导0的字符型:
补全警察数据的GEOID前导0
用stringr包的str_pad()函数补全前导0,先确认普查数据GEOID的长度(美国普查tract的GEOID通常是11位,你可以先核对下自己的数据):
# 先安装/加载stringr包 # install.packages("stringr") library(stringr) # 补全前导0到指定长度,这里以11位为例 SDPD_Data_Census$GEOID <- str_pad(SDPD_Data_Census$GEOID, width = 11, side = "left", pad = "0")
验证格式一致性
转换后检查两个数据集的GEOID格式是否完全一致:
# 查看普查数据GEOID的前5行 head(SD.city.tracts$GEOID) # 查看警察数据GEOID的前5行 head(SDPD_Data_Census$GEOID)
确保两者的字符长度、编码格式完全匹配,比如都是"06073000100"这类带前导0的格式。
步骤2:重新执行合并操作
格式统一后,再用left_join()合并(这样能完整保留空间数据的所有观测):
SD_Police_Census <- left_join(SD.city.tracts, SDPD_Data_Census, by = "GEOID")
步骤3:验证合并结果
合并后检查警察变量是否正常赋值:
# 统计policestop字段的非NA数量 sum(!is.na(SD_Police_Census$policestop)) # 统计policestoprate字段的非NA数量 sum(!is.na(SD_Police_Census$policestoprate))
如果两个数值都等于你的总观测数,说明合并完全成功了!
补充:为什么full_join会把数据追加到末尾?
因为GEOID格式不匹配时,full_join()会保留两边所有无法匹配的观测——普查数据的观测在前,警察数据因为格式问题全匹配不上,就会被追加到数据集末尾,此时空间数据列为NA,警察数据列有值,这也反过来验证了是GEOID匹配的问题。
内容的提问来源于stack exchange,提问作者Sheri
相关产品推荐
相关产品推荐

