R合并空间数据框与常规数据框时出现全列缺失值问题咨询
空间属性数据匹配失败排查与解决方案
- 校验两个数据集GEOID的字符一致性:GEOID通常为带前导零的固定长度字符串,转换为整数时会自动丢失前导零,是这类匹配失败的最常见原因。例如标准11位美国普查区GEOID
06037101100转整数后会变为6037101100,与空间数据中存储的字符串型GEOID完全无法匹配。可先运行以下代码校验匹配情况:# 查看两个表GEOID的类型和前5条值 class(censustracts$GEOID) head(censustracts$GEOID, 5) class(cancerdatacrosswalk$GEOID) head(cancerdatacrosswalk$GEOID, 5) # 统计两个表GEOID的交集数量,若返回0说明无有效匹配值 length(intersect(censustracts$GEOID, cancerdatacrosswalk$GEOID)) - 统一GEOID格式:确认你所用区域的普查区GEOID标准长度后,将两个表的GEOID统一转为等长字符串,补全前导零:
# 示例为11位GEOID,可根据实际长度调整width参数 censustracts$GEOID <- stringr::str_pad(as.character(censustracts$GEOID), width = 11, side = "left", pad = "0") cancerdatacrosswalk$GEOID <- stringr::str_pad(as.character(cancerdatacrosswalk$GEOID), width = 11, side = "left", pad = "0") - 清除隐藏字符:部分数据导出时会附带空格、换行符等不可见字符,导致表面一致的GEOID实际无法匹配,可运行以下代码清除两端空白:
censustracts$GEOID <- trimws(censustracts$GEOID) cancerdatacrosswalk$GEOID <- trimws(cancerdatacrosswalk$GEOID) - 重新执行合并:如果使用的是sp类空间对象,建议先转为sf对象再合并,避免空间属性丢失:
library(sf) # 转换sp对象为sf对象,若原始数据已是sf可跳过该步 censustracts_sf <- st_as_sf(censustracts) # 合并操作 newcensus <- merge(censustracts_sf, cancerdatacrosswalk, by = "GEOID") - 导出为shapefile:
st_write(newcensus, "census_cancer.shp", delete_layer = TRUE)
内容的提问来源于stack exchange,提问作者agodinezmm
相关产品推荐
相关产品推荐

