我有一个具有8.5个唯一纬度/经度的数据框和一个具有693个唯一纬度/经度的表。我想返回一个向量,该向量包含针对693个位置的8.5 M行中的每一行的最小Haversine距离(以米为单位)。
我写了下面的函数来完成我需要做的事情,但是不能以我需要的规模进行操作。我希望不必对数据进行子集处理并针对子集运行。
我认为我的问题很大一部分是由于我的功能效率低下,但没有想到一个优雅而有效的解决方案。仅供参考:我有一个带有512GB RAM的24核CPU,因此对我的数据进行操作不是问题。
library(geosphere)
Lat1 <- c(29.67633, 42.58322, 42.89643, 40.08702, 32.41955, 36.92045)
Long1 <- c(-90.77054, -87.86715, -88.04080, -74.97728, -92.98497, -93.93032)
Lat2 <- c(31.19734, 39.67220, 33.64105, 32.40145, 61.18134, 64.83558)
Long2 <- c( -85.41284, -86.36804, -86.61426, -86.21394, -149.93617, -147.82972)
df1 <- data.frame(Lat1, Long1)
df2 <- data.frame(Lat2, Long2)
min_dist <- function(df, dlr_df, long1, lat1, long2, lat2){
# Calculate min distance from all dealers
d <- matrix(NA,nrow(df),nrow(dlr_df))
for (i in 1:nrow(df)) {
for (j in 1:nrow(dlr_df)) {
d[i,j] <- distHaversine(c(long1[i], lat1[i]), c(long2[j], lat2[j]))/1000
}
m <- apply(d, 1, function(x) min(x))
}
return(m)
}
distance <- min_dist(df1, df2, df1$Long1, df1$Lat1, df2$Long2, df2$Lat2)
我的结果是:
[1] 529.9173 347.5628 385.2080 973.4943 609.8046 727.9073
当我在整个数据帧上运行时,R崩溃。
预先感谢