gpt4 book ai didi

r - 计算经纬度所有可能组合之间的距离

转载 作者:行者123 更新时间:2023-12-05 01:18:36 25 4
gpt4 key购买 nike

我无法让下面的代码工作。我正在尝试计算我的数据集中所有可能的经纬度组合之间的距离。

我将使用的示例输入数据:

p <- data.frame(lat=runif(6,-90,90), lon=runif(6,-180,180) );

我无法让下面的代码工作。距离函数不起作用,所以我尝试了 distm,但这也给了我一条错误消息。错误消息列在代码下方。

d <- setNames(do.call(rbind.data.frame, 
combn(1:nrow(p), 2, simplify = FALSE)),
c('p1','p2'));
d$dist <- sapply(1:nrow(d), function(r){
distance(p$lat[d$p1[r]], p$lat[d$p2[r]], p$lon[d$p1[r]], p$lon[d$p2[r]])
})

d$dist <- sapply(1:nrow(d), function(r){
distm(p$lat[d$p1[r]], p$lat[d$p2[r]], p$lon[d$p1[r]], p$lon[d$p2[r]])
})

#> Error in distm(p$lat[d$p1[r]], p$lat[d$p2[r]], p$lon[d$p1[r]], p$lon[d$p2[r]]) :
#> unused argument (p$lon[d$p2[r]])

最佳答案

geosphere::distHaversine(以及大多数其他距离函数)是矢量化的,因此您可以一次对所有对调用它。将其全部放入一个漂亮的 data.frame 中,

p <- data.frame(lat = runif(6, -90, 90), 
lon = runif(6, -180, 180))

# get row indices of pairs
row_pairs <- combn(nrow(p), 2)

# make data.frame of pairs
df_dist <- cbind(x = p[row_pairs[1,],],
y = p[row_pairs[2,],])
# add distance column by calling distHaversine (vectorized) on each pair
df_dist$dist <- geosphere::distHaversine(df_dist[2:1], df_dist[4:3])

df_dist
#> x.lat x.lon y.lat y.lon dist
#> 1 -10.281070 -156.30519 -7.027720 -104.76897 5677699
#> 1.1 -10.281070 -156.30519 -51.142344 -100.99517 6750255
#> 1.2 -10.281070 -156.30519 -3.979805 -141.43436 1785251
#> 1.3 -10.281070 -156.30519 -21.239130 -65.97719 9639637
#> 1.4 -10.281070 -156.30519 66.292704 -154.52851 8525401
#> 2 -7.027720 -104.76897 -51.142344 -100.99517 4923176
#> 2.1 -7.027720 -104.76897 -3.979805 -141.43436 4075742
#> 2.2 -7.027720 -104.76897 -21.239130 -65.97719 4459657
#> 2.3 -7.027720 -104.76897 66.292704 -154.52851 9085777
#> 3 -51.142344 -100.99517 -3.979805 -141.43436 6452943
#> 3.1 -51.142344 -100.99517 -21.239130 -65.97719 4502520
#> 3.2 -51.142344 -100.99517 66.292704 -154.52851 13833468
#> 4 -3.979805 -141.43436 -21.239130 -65.97719 8350236
#> 4.1 -3.979805 -141.43436 66.292704 -154.52851 7893225
#> 5 -21.239130 -65.97719 66.292704 -154.52851 12111227

或者,您可以使用 geosphere::distm,它会为您提供距离矩阵,其中包含不同格式的相同数据:

geosphere::distm(p[, 2:1])
#> [,1] [,2] [,3] [,4] [,5] [,6]
#> [1,] 0 5677699 6750255 1785251 9639637 8525401
#> [2,] 5677699 0 4923176 4075742 4459657 9085777
#> [3,] 6750255 4923176 0 6452943 4502520 13833468
#> [4,] 1785251 4075742 6452943 0 8350236 7893225
#> [5,] 9639637 4459657 4502520 8350236 0 12111227
#> [6,] 8525401 9085777 13833468 7893225 12111227 0

?distHaversine 所述,距离以米为单位。随意转换。另请注意,geosphere 的函数采用经/纬度,而不是纬度/经度,因此需要反转列才能工作。

关于r - 计算经纬度所有可能组合之间的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44533952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com