You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合并美国普查空间数据与警察数据后非空间字段全为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:26:56