如何用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
相关产品推荐
相关产品推荐

