在R中筛选距多边形质心5km内的行政区并计算统计量
解决牙买加行政区5km邻区统计量计算问题
问题根源
你当前代码里unlist(shp_dist)会把所有邻区的索引合并成一个向量,直接丢失了原行政区和其邻区的对应关系,自然没法按每个原行政区分组计算邻区的统计量。dnearneigh返回的是nb类型的邻接列表,每个位置的元素对应原sf_communities中对应行的行政区的邻区索引,得利用这种对应关系来处理。
可行操作步骤
1. 保留邻接对应关系:转成配对数据框
先把nb邻接列表转成包含“原行政区ID”和“邻区ID”的配对数据框,明确每个原区对应的所有邻区:
# 先给原行政区加唯一ID(如果数据里没有现成的唯一标识) sf_communities$id <- seq(nrow(sf_communities)) # 把nb对象转成数据框 library(spdep) nb_df <- as.data.frame(shp_dist) colnames(nb_df) <- c("origin_id", "neighbor_id") # 注:origin_id是原行政区在sf_communities中的行号,neighbor_id是对应邻区的行号
2. 关联邻区的属性数据
把邻区的属性和原行政区关联,方便后续统计:
# 提取邻区需要统计的属性,重命名ID列方便关联 neighbor_attrs <- sf_communities %>% select(id, 你的统计列名1, 你的统计列名2) %>% # 替换成实际要计算的列 rename(neighbor_id = id) # 关联原行政区和邻区属性 origin_neighbor_pair <- left_join(nb_df, neighbor_attrs, by = "neighbor_id")
3. 按原行政区分组计算统计量
现在可以按origin_id分组,计算每个原行政区邻区的汇总统计(比如均值、总和、数量等):
# 示例:计算邻区某数值列的均值、总和、邻区数量 stats_result <- origin_neighbor_pair %>% group_by(origin_id) %>% summarise( neighbor_avg = mean(目标数值列, na.rm = TRUE), neighbor_total = sum(目标数值列, na.rm = TRUE), neighbor_num = n() ) # 把统计结果关联回原空间数据框 sf_communities_with_stats <- left_join(sf_communities, stats_result, by = c("id" = "origin_id"))
更简洁的替代方案:用spdep内置函数
如果只是计算邻区均值这类常见统计,spdep有直接基于nb对象的函数,不用手动转数据框:
# 示例:计算每个行政区邻区的人口均值(假设列名为pop) sf_communities$neighbor_pop_avg <- lag.listw(nb2listw(shp_dist), sf_communities$pop)
原代码问题说明
你之前的subset <- sf_communities[unlist(shp_dist),]只是提取了所有邻区的集合,但丢失了原区和邻区的对应关系,仅适合查看所有邻区的整体情况,没法按原行政区做分组统计。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

