R语言 使用距离矩阵求出邻近商店的数量

j2datikz  于 2022-12-06  发布在  其他
关注(0)|答案(2)|浏览(113)

我有一个商店及其彼此间相对距离的矩阵,类似于此表,有3000行和3000列。我想创建一个新表,显示距离每个商店5公里或更近的商店数。
| | 商店1|
| - -|- -|
| 商店1|不适用|
| 商店2| 200(百万)|
我用一个数据框创建了这个距离矩阵,它包含每个悬挂物的x坐标和y坐标。

dist_matrix <- st_distance(df)
diag(dist_matrix) <- NA

这样就得到了一个矩阵,其中包含了悬挂物到下一个悬挂物的距离,单位为米。
我想找出位于每个商店5公里半径内的商店数量。我尝试这样做:`

#making the matrix into a data frame
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)

但它似乎不起作用。有人对如何解决这个问题有投入吗?

mum43rcc

mum43rcc1#

我相信你会发现使用基函数colSums()是很有用的,它与一个小于你所需要的任何阈值的逻辑距离矩阵配对。
由于我无法访问您的数据,我将使用我最喜欢的三北卡罗来纳州城镇的距离矩阵(因为nc.shp位于{sf})。
此示例的作用是:

  • 它计算三个城市的距离矩阵,去掉单位维以便于计算(无需记住我们讨论的是米)
  • 提供距离矩阵名称,以便于使用
  • 创建距离小于150000米的逻辑矩阵logi
  • 计算小于150000米的距离矩阵的列和。

请注意,每个城市都会自动包含在内(距离为零--它位于原始矩阵的对角线上),因此您需要减去1。或者,就像您在原始代码中所做的那样,将diagonal设置为NA,并使用na.rm = TRUE/执行colSums(),只要执行两个中的一个即可。

library(sf)
library(dplyr)

cities <- data.frame(name = c("Raleigh", "Greensboro", "Wilmington"),
                     x = c(-78.633333, -79.819444, -77.912222),
                     y = c(35.766667, 36.08, 34.223333)) %>% 
  st_as_sf(coords = c("x", "y"), crs = 4326)

result <- cities %>% 
  st_distance() %>% 
  units::drop_units()

colnames(result) <- cities$name

logi <- result < 150000 # here will be your 500 meters

colSums(logi)
# Raleigh Greensboro Wilmington 
#       2          2          1
3htmauhk

3htmauhk2#

这有用吗?

dist_matrix |>
  filter_all(all_vars(.<=5000)) #assuming 5000m

相关问题