R语言 找出有多少点在一定的半径范围内?(并显示Map上每个点的半径?)

rfbsl7qr  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(130)

我有两个项目需要做类似的事情。我有商店的数据集,包括纬度和经度坐标,我需要知道,对于每个商店,半径2英里内是否有其他商店。对于其中一个项目,如果我能在Map上看到半径就特别有用了。我有所有的点Map使用mapview和希望如果我能看到一个圆圈超过每一个这样我就可以看到是否有任何差距(新店不能建在现有商店的2英里范围内)对于另一个项目,我想得到的是一列显示那个半径内其他商店的数量,这个看起来更容易,虽然我还没有弄明白。我是新来的。
我试过geodist,并按照教程得到一个距离矩阵,但我不能很好地阅读它,我不认为这是我需要的。我也试过points_in_circle,它确实告诉我哪些商店在半径内,但我需要它对每对坐标都这样做(我有80行),并理想地给予一个更有用的输出。

mzmfm0qo

mzmfm0qo1#

对于第二个问题(一定半径内其他商店的数量),可以使用前面提到的geodist函数,然后进行一些数据管理来获得结果。
下面的命令将在一个包含五个商店的小数据集上工作。它包含带有纬度和经度坐标的商店ID。

n.stores <- 5
set.seed(1234)
stores <- cbind(sort(sample(1:10, n.stores)), 
                runif (n.stores, -0.1, 0.1), 
                runif (n.stores, -0.1, 0.1)); stores

colnames(stores) <- c("store_id", "lat", "long")
stores
#      store_id          lat        long
# [1,]        1  0.033216752  0.08468670
# [2,]        4  0.002850228 -0.04153683
# [3,]        5  0.038718258  0.06745913
# [4,]        6  0.008994967 -0.04275534
# [5,]       10 -0.043453283 -0.04663584

现在计算每个商店和其他商店之间的距离,包括它自己。

d <- geodist (stores[,2:3]) # A 5-by-5 matrix
d
#           [,1]       [,2]      [,3]       [,4]      [,5]
# [1,]     0.000 14427.8245  2009.804 14416.5478 16899.483
# [2,] 14427.825     0.0000 12752.057   696.1801  5176.953
# [3,]  2009.804 12752.0567     0.000 12686.0604 15625.871
# [4,] 14416.548   696.1801 12686.060     0.0000  5844.660
# [5,] 16899.483  5176.9527 15625.871  5844.6603     0.000

距离以米为单位。将此矩阵转换为数据框以便于下一步。

df <- as.data.frame(d)
colnames(df) <- stores[,'store_id']
df$store_A <- as.numeric(colnames(df))
#           1          4         5          6        10 store_A
# 1     0.000 14427.8245  2009.804 14416.5478 16899.483       1
# 2 14427.825     0.0000 12752.057   696.1801  5176.953       4
# 3  2009.804 12752.0567     0.000 12686.0604 15625.871       5
# 4 14416.548   696.1801 12686.060     0.0000  5844.660       6
# 5 16899.483  5176.9527 15625.871  5844.6603     0.000      10

然后,你可以将其转换为长格式,列出或计算出彼此相距一定距离(比如10公里)内的商店数量。

library(tidyr)
library(dplyr)

df.long <- pivot_longer(df, -store_A, 
                        names_to="store_B", 
                        values_to="distance", 
                        names_transform=as.numeric) %>%
  filter(store_A != store_B) # omit self-references

df.long
# A tibble: 10 × 3
#   store_A store_B distance
#     <dbl>   <dbl>    <dbl>
# 1       1       4   14428.
# 2       1       5    2010.
# 3       1       6   14417.
# 4       1      10   16899.
# 5       4       1   14428.
# 6       4       5   12752.
# 7       4       6     696.
# 8       4      10    5177.
# 9       5       1    2010.
#10       5       4   12752.
#11       5       6   12686.
#12       5      10   15626.
#13       6       1   14417.
#14       6       4     696.
#15       6       5   12686.
#16       6      10    5845.
#17      10       1   16899.
#18      10       4    5177.
#19      10       5   15626.
#20      10       6    5845.

现在团体也算了。

group_by(df.long, store_A) %>%
  filter(distance<10000) %>%
  print() %>%
  summarise(n=n())

# A tibble: 8 × 3
# Groups:   store_A [4]
#   store_A store_B distance
#     <dbl>   <dbl>    <dbl>
# 1       1       5    2010.
# 2       4       6     696.
# 3       4      10    5177.
# 4       5       1    2010.
# 5       6       4     696.
# 6       6      10    5845.
# 7      10       4    5177.
# 8      10       6    5845.

# A tibble: 5 × 2
#   store_A     n
#     <dbl> <int>
# 1       1     1
# 2       4     2
# 3       5     1
# 4       6     2
# 5      10     2

因此,商店“1”在10公里内有1家商店,商店“4”有2家,商店“5”有1家,商店“6”和“10”各有2家。

相关问题