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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 11:05:06