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

如何用R的rgeoda将学校经纬度点聚类为每组5个最近邻?

解决rgeoda空间聚类的规模约束问题

先修复你遇到的sf转geoda错误,再实现带规模限制的空间邻近性聚类:

1. 修复sf对象转换错误

你碰到的wrong arguments for subsetting an environment错误,通常是输入的sf对象几何无效或格式异常导致,先执行以下处理:

library(sf)
library(rgeoda)

# 修复几何有效性
latlong_geom <- st_make_valid(latlong_geom)

# 确认是POINT类型(学校点位数据必须为点几何)
if (st_geometry_type(latlong_geom, by_geometry = FALSE) != "POINT") {
  stop("输入的sf对象必须为POINT几何类型")
}

# 转换为rgeoda对象
literacy_geoda <- sf_to_geoda(latlong_geom)

2. 创建适合点数据的空间权重

学校是点位数据,不适用queen/rook权重,改用k最近邻权重(匹配你5个学校一组的需求,设置k=5),确保聚类满足邻近性要求:

# 创建k=5的最近邻权重
knn_weights <- knn_weights(literacy_geoda, k = 5)

3. 带规模约束的空间聚类(AZP算法)

rgeoda的azp()(Automatic Zone Procedure)算法支持指定组数量、组大小范围,刚好匹配你的需求(60组,59组5校+1组3校):

# 准备聚类变量:如果仅基于空间邻近性,直接用坐标作为变量
coords_vars <- st_coordinates(latlong_geom)

set.seed(123)
# 运行AZP聚类:指定60组,组大小3-5
azp_result <- azp(
  weights = knn_weights,
  data = coords_vars,
  n_clusters = 60,
  min_size = 3,
  max_size = 5
)

# 将聚类结果映射回sf对象
latlong_geom$cluster_school <- azp_result$Clusters

# 验证各组规模
table(latlong_geom$cluster_school)

4. 替代方案:SKATER算法

如果AZP效果不符合预期,可使用skater()算法(基于空间树的分割方法),同样支持规模约束:

set.seed(123)
skater_result <- skater(
  weights = knn_weights,
  data = coords_vars,
  n_clusters = 60,
  min_size = 3
)

latlong_geom$cluster_school <- skater_result$Clusters
table(latlong_geom$cluster_school)

关键说明

  • AZP和SKATER都是空间约束聚类算法,会优先保证组内的空间邻近性,同时满足你设置的组规模要求。
  • 若你有学校的属性数据(如升学率、预算等),可替换coords_vars为对应属性列,实现基于属性+空间邻近性的聚类。

内容的提问来源于stack exchange,提问作者Virginia Spinks

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 10:27:38