Я хочу рассчитать наименьшее географическое расстояние между каждой строкой и столбцом двух информационных фреймов.
DF1 имеет ряд учреждений, а DF2 имеет ряд мероприятий. Мол, так:
#DF1 (institutions)
DF1 <- data.frame(latitude=c(41.49532, 36.26906, 40.06599),
longitude=c(-98.77298, -101.40585, -80.72291))
DF1$institution <- letters[seq( from = 1, to = nrow(DF1))]
#DF2 (events)
DF2 <- data.frame(latitude=c(32.05, 32.62, 30.23), longitude=c(-86.82,
-87.67, -88.02))
DF2$ID <- seq_len(nrow(DF1)
Я хочу вернуть событие с наименьшим расстоянием до каждого учреждения в DF1 и добавить расстояние и ID от DF2 до DF1. Хотя я знаю, как рассчитать попарное расстояние, я не в состоянии рассчитать все расстояния от DF [1,] до DF2 и вернуть наименьшее значение и так далее.
Это то, что я пытался (и не смог).
library(geosphere)
#Define a function
distanceCALC <- function(x, y) { distm(x = x, y = y,
fun = distHaversine)}
#Define vector of events
DF2_vec <- DF2[, c('longitude', 'latitude')]
#Define df to hold distances
shrtdist <- data.frame()
Теперь, моя попытка состояла в том, чтобы передать distanceCALC строкой DF1 и векторизованными событиями.
#Loop through every row in DF1 and calculate all the distances to instutions a, b, c. Append to DF1 smallest distance + DF2$ID.
#This only gives me the pairwise distance
for (i in nrow(DF1)){
result <- distanceCALC(DF1[i,c('longitude', 'latitude')], DF2_vec)
}
#Somehow take shortest distance for each row*column distance matrix
shrtdist <- rbind(shrtdist, min(result[,], na.rm = T))
Я предполагаю, что решение влечет за собой изменение формы данных и их отсутствие. Кроме того, цикл является очень плохой практикой и слишком медленным, учитывая количество наблюдений.
Любая помощь очень ценится.