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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:45:45