R语言中left_join连接SpatialPolygons与数据框后空间多边形数据不匹配问题
R语言中left_join连接SpatialPolygons与数据框后空间多边形数据不匹配问题
嘿,我遇到个头疼的问题:从开源网站下了shapefile和数据框,把它们连起来之后,数据和多边形完全对应不上了!先把我的代码贴出来,大伙帮我瞅瞅哪里错了?
library(sf) library(leaflet) library(dplyr) library(leaflet.extras) # 从数据源创建数据框 raw_data <- read.csv("fr-en-dnb-par-etablissement.csv",sep=";") %>% filter(ï..session == 2021)%>% filter(code_departement == "075")%>% select(patronyme,taux_de_reussite) # 读取学区中学的shapefile my_shapefile <- st_read("secteurs-scolaires-colleges") # 转成SpatialPolygon对象并复制一份用于对比 spdf <- as_Spatial(my_shapefile) spdf_copy <- as_Spatial(my_shapefile) # 尝试把数据框的数据连接到其中一个SpatialPolygonsDataFrame(代码未完成,核心问题在连接环节)
问题根源分析
我瞅了下你的代码,大概率是这两个坑导致的:
- 没必要转成旧的Spatial类:sf是现在R空间数据处理的标准,和dplyr的兼容性比旧的SpatialPolygonsDataFrame好太多,强行转换后用left_join很容易出现索引错位,导致多边形和数据对不上。
- 没指定连接的匹配列:left_join默认会找相同列名的字段来连接,但如果你的shapefile和数据框没有同名的匹配字段(比如学校名称、区域编码),它会直接做笛卡尔积,把所有行两两组合,这肯定会乱套!
修正后的解决方案
直接用sf对象处理,并且明确指定匹配列(这里假设shapefile里的学校名称列是nom_etab,你需要根据实际列名替换,可先用names(my_shapefile)查看shapefile的列名):
library(sf) library(leaflet) library(dplyr) library(leaflet.extras) # 读取并清洗数据框 raw_data <- read.csv("fr-en-dnb-par-etablissement.csv", sep=";") %>% filter(ï..session == 2021) %>% filter(code_departement == "075") %>% select(patronyme, taux_de_reussite) # 直接读取为sf对象,无需转换 my_sf <- st_read("secteurs-scolaires-colleges") # 关键!指定正确的匹配列,比如shapefile的学校名称列是nom_etab,数据框的是patronyme joined_sf <- my_sf %>% left_join(raw_data, by = c("nom_etab" = "patronyme")) # 这里的匹配列一定要对应实际情况 # 用leaflet验证结果 leaflet(joined_sf) %>% addTiles() %>% addPolygons( popup = ~paste("学校:", nom_etab, "<br>通过率:", taux_de_reussite) )
额外提醒
- 先确认两个数据集的匹配字段是完全一致的,比如名称的拼写、大小写、有没有多余空格,必要的时候可以用
stringr包清洗(比如str_to_lower()统一小写,str_trim()去空格)。 - 尽量避免使用旧的Spatial类,sf生态现在已经非常成熟,处理空间数据更稳定。
备注:内容来源于stack exchange,提问作者jin len
相关产品推荐
相关产品推荐

