在R中如何将矩阵坐标点与大型空间多边形数据框空间连接并计算均值?
问题分析与解决方案
错误原因
你调用over()时的参数错误是核心问题:
Zambia_districts@polygons是sp::Polygons对象的列表,不能用[ , "coords"]这种二维索引方式访问,这直接导致了"incorrect number of dimensions"报错。over()的第二个参数需要完整的SpatialPolygonsDataFrame对象(即你的Zambia_districts),而非单独提取多边形的坐标部分。
另外必须注意:点数据(A)和多边形数据(Zambia_districts)的投影坐标系必须完全一致,否则空间连接会失效或得到错误结果。
完整解决方案步骤
1. 修正空间连接代码
你前面的点数据空间转换步骤是正确的,保留后用正确方式调用over():
# 将矩阵转为数据框 A <- as.data.frame.matrix(A) # 转换为SpatialPointsDataFrame coordinates(A) <- ~ long + lat # 设置投影(WGS84) proj4string(A) <- CRS("+proj=longlat +datum=WGS84 +no_defs") # 检查多边形数据的投影,确保和点数据一致 # 若不一致,先转换投影: # Zambia_districts <- spTransform(Zambia_districts, proj4string(A)) # 执行空间连接:将多边形属性关联到每个点 A_with_district <- over(A, Zambia_districts, returnList = FALSE) # 合并连接后的属性到原点数据 A_joined <- cbind(A@data, A_with_district)
2. 按地区计算prob_enrolled均值
提供两种实现方式:
方式1:base R
district_mean <- aggregate(prob_enrolled ~ DISTRICT, data = A_joined, FUN = mean)
方式2:dplyr(更直观)
library(dplyr) district_mean <- A_joined %>% group_by(DISTRICT) %>% summarize(mean_prob = mean(prob_enrolled, na.rm = TRUE))
3. 将均值合并到多边形数据
把计算好的均值关联到Zambia_districts的属性表,方便后续绘图:
# 按DISTRICT字段匹配合并 Zambia_districts@data <- left_join(Zambia_districts@data, district_mean, by = "DISTRICT")
4. 绘制着色地图
提供两种绘图方式:
方式1:sp包快速绘图
library(sp) spplot(Zambia_districts, "mean_prob", main = "赞比亚各地区prob_enrolled均值", col.regions = rev(heat.colors(10)), # 设置渐变颜色 legend.title = "均值")
方式2:ggplot2 + sf(更灵活)
library(sf) library(ggplot2) # 将sp对象转为sf格式 zambia_sf <- st_as_sf(Zambia_districts) ggplot(zambia_sf) + geom_sf(aes(fill = mean_prob)) + scale_fill_viridis_c(option = "plasma", na.value = "gray90") + labs(title = "赞比亚各地区prob_enrolled均值", fill = "均值") + theme_minimal()
内容的提问来源于stack exchange,提问作者Zizi
相关产品推荐
相关产品推荐

