Этот ответ был полезен при поиске потенциальных решений.
Первым шагом было бы создание матрицы расстояний с distm
на основе обоих ваших фреймов данных. Вы можете выбрать distHaversine
метод, если вы будете sh, с другими доступными.
Тогда вы можете определить с ближайшим магазином для каждого клиента по max.col
(отрицательный знак перед mat
проверит значение это наименее отрицательное).
Вы также можете добавить расстояние от матрицы (здесь в метрах).
Я составил несколько примеров данных из США и изменил хранилище на A, B, C для ясности в ответе.
library(geosphere)
# create a distance matrix
mat <- distm(customer_data[,c('long','lat')], store_data[,c('long','lat')], fun=distHaversine)
# assign the store name to customer_data based on shortest distance in the matrix
customer_data$locality <- store_data$store[max.col(-mat)]
# add distance in km for that store
customer_data$nearest_dist <- apply(mat, 1, min)/1000
Выход
customer_id lat long locality nearest_dist
1 1 41.8 87.6 A 313.5497
2 2 40.7 74.0 B 440.4867
3 3 36.8 119.4 C 784.7909
Данные
customer_data <- data.frame(
customer_id = c(1, 2, 3),
lat = c(41.8, 40.7, 36.8),
long = c(87.6, 74, 119.4)
)
store_data <- data.frame(
store = c("A", "B", "C"),
lat = c(44.5, 44.5, 43.8),
long = c(88.7, 72.5, 120.5)
)