Применение distHaversine и создание минимального выхода - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть два кадра данных. Один, содержащий IP-адрес клиента, а другой - местоположение магазина.

Я хотел бы сгенерировать расстояние (используя distHaversine) от IP-адреса клиента до ближайшего местоположения магазина. Я представляю, как применить dishaversine к широте и длине покупателя по отношению к широте и длине каждого магазина, а затем использовать which.min для вывода наименьшего результата.

Ниже приведен снимок того, как выглядят данные.

    customer_data
customer_id lat long 
1 50 33
2 44 -21
3 129 -22


    store_data
store lat long
1 33 22
2 -111 -139
3 23 30

1 Ответ

0 голосов
/ 11 февраля 2020

Этот ответ был полезен при поиске потенциальных решений.

Первым шагом было бы создание матрицы расстояний с 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)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...