如何基于3000×3000距离矩阵统计每家门店5km内的门店数量?
解决门店5km范围内数量统计问题
我有一个3000行3000列的门店间距离矩阵,通过包含门店x、y坐标的数据框执行以下代码生成:
dist_matrix <- st_distance(df) diag(dist_matrix) <- NA
矩阵存储的是门店间的距离(单位:米),我想生成新表格统计每家门店5km(5000米)范围内的门店数量,但尝试的代码未达到预期效果,求解决方案。
我之前尝试的代码:
# 将矩阵转为数据框 dist_matrix <- data.frame(dist_matrix) names(dist_matrix) <- df$store_id rownames(dist_matrix) <- df$store_id close <- dist_matrix %>% mutate(ID=rownames(.)) %>% gather('closest','dist',-ID) %>% filter(!is.na(dist)) %>% arrange(dist)
解决方案
你的代码仅完成了矩阵到长格式数据的转换,缺少分组计数的核心步骤。以下提供两种高效实现方式:
方式一:直接基于矩阵操作(效率更高)
针对3000×3000的矩阵,直接按行统计符合条件的元素数量,避免转换长格式的性能损耗:
# 生成统计结果 nearby_counts <- data.frame( store_id = rownames(dist_matrix), nearby_5km_count = apply(dist_matrix, 1, function(row) sum(row <= 5000, na.rm = TRUE)) )
apply(dist_matrix, 1, ...):按行遍历矩阵sum(row <= 5000, na.rm = TRUE):统计每行中距离≤5000米的门店数量,na.rm = TRUE忽略对角线的NA值(排除门店自身)
方式二:基于tidyverse的长格式处理
如果你偏好tidyverse语法,在原有代码基础上补充分组计数步骤(推荐用pivot_longer替代已过时的gather):
library(tidyverse) close <- dist_matrix %>% mutate(store_id = rownames(.)) %>% pivot_longer(cols = -store_id, names_to = "closest_store", values_to = "distance") %>% filter(!is.na(distance), distance <= 5000) %>% group_by(store_id) %>% summarise(nearby_5km_count = n()) %>% ungroup()
pivot_longer:将宽格式矩阵转为长格式的门店-距离对filter(...):筛选出有效且距离≤5000米的记录group_by + summarise(n()):按门店分组统计符合条件的数量
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

