【发布时间】:2020-10-12 21:43:40
【问题描述】:
这是我试图在 rstudio 中运行的代码。我知道迭代太长了。有没有最佳/更快的方法来做到这一点?我已经被困了 4 个多小时,而且似乎不会很快完成。
我正在尝试在 415 个城市和 3680126 个纪念碑之间建立一个距离矩阵。为了优化,我只是将那些古迹与同一个国家的城市进行比较。
for(x in 1:3680126){
for(y in 1:415){
if(list2_cities$Country[y]==list1_POI$Country[x]){
distance_matrix [x,y] <- ({POI$Longitude[x]-cities$Longitude[y]}^2)+({POI$Latitude[x]-cities$Latitude[y]}^2)
}
else{
distance_matrix [x,y] <- 0
}
}
}
【问题讨论】:
-
如果这些真的是地理空间意义上的经纬度,那么我要回答的第一个问题是:不要这样做。勾股定理在笛卡尔空间中运行良好,但地理坐标不是笛卡尔坐标。即使您不关心距离计算的正确单位,在地球上的大部分地区,1 度纬度和 1 度经度也有很大的不同。我建议使用
geosphere::dist*函数之一,具体取决于您对精度的需求。 -
@r2evans 这是有道理的。我正在使用 geosphere,但它也需要很长时间。有什么办法可以在更短的时间内完成?
-
您的两个循环正在执行 15 亿次迭代,使用任何方法都需要一些时间。托马斯在下面的回答是一个巨大的进步。我建议按国家/地区拆分您的数据框,然后在较小的数据集上使用
distm函数。这将通过避免计算跨越国界的距离来提高性能。
标签: r dataframe matrix optimization