请求优化/精简处理空间对象的R代码,整合结果并提升效率
R语言代码优化建议:减少重复并整合结果
核心优化思路
针对你代码中重复计算、结果分散的问题,优化方向是一次性计算基础数据,再通过分组整合多阈值场景结果,既提升效率,又能得到便于后续分析的单一数据对象。
优化后代码
library(sf) library(dplyr) library(tidyr) # 1. 一次性计算所有缓冲区的建筑数量和学校数量 # 避免重复调用st_intersects(空间计算耗时,重复调用浪费资源) buffer_full <- buffer3000 %>% mutate( 建筑数量 = lengths(st_intersects(., shp_BAG)), 学校数量 = lengths(st_intersects(., shp_BAG_slim)) ) # 2. 定义阈值列表,生成整合所有场景的数据集 thresholds <- c(1500, 1000, 500) buffer_combined <- purrr::map_dfr(thresholds, function(th) { buffer_full %>% filter(建筑数量 >= th) %>% # 修正原代码逻辑:需求是≥阈值,原代码写为<= mutate(阈值场景 = paste0("≥", th, "栋")) }) # 可选:加入原始全量数据,方便对比 buffer_combined <- bind_rows( buffer_full %>% mutate(阈值场景 = "所有缓冲区"), buffer_combined )
优化点说明
- 减少重复计算:仅调用2次
st_intersects(原代码调用4次),空间数据量大时效率提升明显 - 结果统一整合:所有阈值场景的数据存储在同一个sf数据框中,通过
阈值场景列区分不同场景 - 修正逻辑错误:原代码过滤条件用了
<=,与需求的「≥阈值」不符,已修正
后续分析示例
统计各场景学校总数
buffer_combined %>% group_by(阈值场景) %>% summarise(学校总数 = sum(学校数量))
绘制不同阈值场景的空间分布图
library(ggplot2) ggplot(buffer_combined) + geom_sf(aes(fill = 学校数量)) + facet_wrap(~阈值场景) + scale_fill_viridis_c(name = "学校数量") + theme_minimal()
内容的提问来源于stack exchange,提问作者Sas
相关产品推荐
相关产品推荐

