如何筛选指定距离外的面要素并计算其汇总统计量?
解决思路与代码示例
问题目标
计算与目标区县距离超过指定阈值的其他区县的汇总统计量(均值、求和等)。
方法1:基于dnearneigh的补集计算
既然你已经能用dnearneigh获取距离范围内的邻居,那么距离外的区县就是「所有区县(排除自身)」减去「距离范围内的邻居」。具体步骤:
- 先获取当前年份所有区县的总索引列表
- 对每个区县,从总索引中剔除自身和近邻,得到距离超阈值的区县索引
- 复用你原有的
lapply逻辑计算统计量
# 承接你原有的代码,在得到within_km_10之后: n <- nrow(shp_centroid_3) all_indices <- 1:n # 生成距离超过10000米的区县索引(排除自身) beyond_km_10 <- lapply(1:n, function(i) { # 去掉自身和距离5000-10000米的近邻 setdiff(all_indices, c(i, within_km_10[[i]])) }) # 计算距离外区县的汇总统计量(和你原有的统计量对应) tourism_beyond10km_mean <- unlist(lapply(beyond_km_10, \(v){mean(shp_centroid_3$TOT_EXP[v], na.rm=TRUE)})) tourism_beyond10km_sum <- unlist(lapply(beyond_km_10, \(v){sum(shp_centroid_3$TOT_EXP[v], na.rm=TRUE)})) tourism_beyond10km_score <- unlist(lapply(beyond_km_10, \(v){mean(shp_centroid_3$Z_SCORE[v], na.rm=TRUE)})) # 其他统计量同理复制即可
方法2:直接用sf的st_distance筛选
如果觉得补集逻辑绕,直接计算距离矩阵后筛选更直观:
# 计算所有区县质心间的距离矩阵(单位:米) dist_matrix <- st_distance(shp_centroid_3, shp_centroid_3) # 生成距离超过10000米的区县索引(排除自身) beyond_km_10 <- lapply(1:n, function(i) { which(dist_matrix[i, ] > 10000 & dist_matrix[i, ] != 0) # 排除自身距离(0) }) # 同样计算统计量,代码和方法1一致 tourism_beyond10km_mean <- unlist(lapply(beyond_km_10, \(v){mean(shp_centroid_3$TOT_EXP[v], na.rm=TRUE)})) # ...其他统计量
注意事项
- 确保距离单位统一:
dnearneigh和st_distance默认用坐标系的单位,你的代码里用的是米,所以阈值要对应(比如10000米=10公里) - 如果区县数量较多,
st_distance生成的矩阵会占用较多内存,此时方法1更高效 - 若需要排除自身,注意在筛选时去掉索引等于自身的项
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

