Вот то, что я пытался для вас. Ваши данные здесь называются mydf
. Сначала получите строки, которые имеют значения в longitude
и latitude
. Для каждой группы, определенной statename
и pincode
, найдите средние значения для longitude
и latitude
. Это создает out
.
library(dplyr)
library(tidyr)
library(purrr)
filter(mydf, complete.cases(latitude) & complete.cases(longitude)) %>%
group_by(statename, pincode) %>%
summarize(ave_long = mean(longitude),
ave_lat = mean(latitude)) -> foo
Следующим шагом было упорядочить foo
таким образом, чтобы мы могли вычислить расстояние Хаверсайна. Я нашел хороший способ упорядочить эти данные. Смотрите ссылку ниже. Здесь мы создаем все возможные комбинации точек данных.
# Arrange this data in a way that we can calculate Haversine.
# We basically create all possible combinations of rows.
# This post gave me a hand: https://community.rstudio.com/t/create-all-possible-combinations-of-a-data-frame/26848/4
myrows <- foo %>%
group_by_all() %>%
group_split()
out <- t(combn(x = 1:nrow(foo), m = 2)) %>%
as_tibble() %>%
mutate_all(~ map(., ~ pluck(myrows, .x))) %>%
unnest() %>%
setNames(nm = c("start_state", "start_pincode",
"start_long", "start_lat",
"dest_state", "dest_pincode",
"dest_long", "dest_lat"))
Мы можем использовать distHaversine () или distGeo (). Но давайте попробуем что-то новое. SymbolixAU написал еще одну функцию. Спасибо, SymbolixAU!
# https://stackoverflow.com/questions/36817423/how-to-efficiently-calculate-distance-between-pair-of-coordinates-using-data-tab/42014364#42014364
dt.haversine <- function(lat_from, lon_from, lat_to, lon_to, r = 6378137){
radians <- pi/180
lat_to <- lat_to * radians
lat_from <- lat_from * radians
lon_to <- lon_to * radians
lon_from <- lon_from * radians
dLat <- (lat_to - lat_from)
dLon <- (lon_to - lon_from)
a <- (sin(dLat/2)^2) + (cos(lat_from) * cos(lat_to)) * (sin(dLon/2)^2)
return(2 * atan2(sqrt(a), sqrt(1 - a)) * r)
}
Последний шаг - расчет расстояний.
mutate(out,
distance = dt.haversine(lon_from = start_long, lat_from = start_lat,
lon_to = dest_long, lat_to = dest_lat)) -> result
# A tibble: 6,105 x 9
# start_state start_pincode start_long start_lat dest_state dest_pincode dest_long dest_lat distance
# <chr> <int> <dbl> <dbl> <chr> <int> <dbl> <dbl> <dbl>
# 1 KARNATAKA 560001 77.6 13.0 KARNATAKA 560003 77.6 13.0 3544.
# 2 KARNATAKA 560001 77.6 13.0 KARNATAKA 560004 77.6 12.9 4554.
# 3 KARNATAKA 560001 77.6 13.0 KARNATAKA 560005 77.6 13.0 3178.
# 4 KARNATAKA 560001 77.6 13.0 KARNATAKA 560008 77.6 13.0 4844.
# 5 KARNATAKA 560001 77.6 13.0 KARNATAKA 560010 77.6 13.0 4618.
# 6 KARNATAKA 560001 77.6 13.0 KARNATAKA 560011 77.6 12.9 5510.
# 7 KARNATAKA 560001 77.6 13.0 KARNATAKA 560013 77.6 13.1 9491.
# 8 KARNATAKA 560001 77.6 13.0 KARNATAKA 560014 77.5 13.1 12047.
# 9 KARNATAKA 560001 77.6 13.0 KARNATAKA 560017 77.7 13.0 6831.
#10 KARNATAKA 560001 77.6 13.0 KARNATAKA 560021 77.6 13.0 5148.