У меня есть набор геокодов с тремя столбцами: широта, долгота и кластер. Я вычислил средний центр кластеров и сохранил результаты в двух списках Center_lat и Center_lon.Расчет с помощью вложенных циклов в R
Теперь я хочу рассчитать расстояние от каждого наблюдения (3000+) до каждого центра кластера (30) с помощью формулы Хаверсина. Чтобы получить матрицу размером 3000 на 30.
Я попытался использовать вложенный цикл, но я получил одинаковое расстояние для всех кластеров. Вот код.
for (i in 1:n){
for (k in 1:c){
lat1=radians(Geocode[i,1])
lon1=radians(Geocode[i,2])
lat2=radians(Center_lat[k,2])
lon2=radians(Center_lon[k,2])
}
R <- 3958.756 # Earth mean radius [miles]
dist_mat[i,] <- acos(sin(lat1)*sin(lat2) + cos(lat1)*cos(lat2) * cos(lon2-lon1)) * R
}
Я также подумываю использовать Lapply для замены вложенного цикла. Но я не уверен, как использовать функцию ... Любая помощь приветствуется.
# Convert to radian
radians = function(theta=0){return(theta * pi/180)}
# Calculates the geodesic distance from each property to the center of it's current cluster using the
# Spherical Law of Cosines (slc)
get_dist <- function(lat1, lon1, lat2, lon2) {
R <- 3958.756 # Earth mean radius [miles]
d <- acos(sin(radians(lat1))*sin(radians(lat2)) +
cos(radians(lat1))*cos(radians(lat2)) * cos(radians(lon2)-radians(lon1))) * R
return(d) # Distance in miles
}
dist_mat<-lapply()
вы можете добавить 'dput (головка (Geocode))' на ваш вопрос – rawr
Пожалуйста сделайте вашу проблему ** [воспроизводимая] (http://stackoverflow.com/a/28481250/2725969) ** в будущем. Обратите внимание, как я это сделал в своем ответе ниже. – BrodieG