Вычисление расстояния между двумя точками с помощью функции distm внутри mutate - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь вычислить расстояние между двумя наборами координат долготы и широты.

Я использую функцию distm () из геосферы пакета, чтобы сделать это.

Работает нормальноесли я вручную ввожу значения в функцию distm (), но не могу заставить ее работать внутри моей команды mutate.

При запуске ее внутри функции mutate я получаю ошибку:

Error in mutate_impl(.data, dots) : 
Evaluation error: Wrong length for a vector, should be 2.

@ Dotpi написал в комментарии «Небольшая заметка. Метод geosphere: distm не векторизован. Для векторизации используйте функции apply.» , когда он ответил в этой теме (Функция для вычисления геопространственного расстояния между двумя точками (широта, длина) с использованием R )

Исходя из этого, я предполагаю, что именно это вызывает ошибку в функции mutate, но я не знаю, какрешить это.Я бы предпочел решение по принципу Tidyverse, но любая помощь приветствуется.

Ниже приведен тестовый фрейм данных с сначала кодом, который выдает ошибку, а затем рабочий пример, где я вручную вставляю значения из первой строки в DF.

library(tidyverse)
library(geosphere)

set.seed(1)
DF <- tibble(
  Long1 = sample(1:10),
  Lat1 = sample(1:10),
  Long2 = sample(1:10),
  Lat2 = sample(1:10))

DF %>% mutate(
  Dist = distm(x= c(Long1, Lat1), y=c(Long2, Lat2), fun = distHaversine ))

distm( x = c(3, 3), y = c(10, 5), fun = distHaversine )

1 Ответ

0 голосов
/ 05 июня 2018

Возможно, мы можем использовать pmap

library(purrr)
pmap_dbl(DF, ~ distm(x = c(..1, ..2), y = c(..3, ..4), 
                    fun = distHaversine) %>% c)

В сочетании с mutate

library(dplyr)
DF %>% 
  mutate(Dist = pmap_dbl(., ~
           distm(x = c(..1, ..2), y = c(..3, ..4), fun = distHaversine)))
# A tibble: 10 x 5
#   Long1  Lat1 Long2  Lat2     Dist
#   <int> <int> <int> <int>    <dbl>
# 1     3     3    10     5  808552.
# 2     4     2     2     6  497573.
# 3     5     6     6     4  248726.
# 4     7    10     1     2 1110668.
# 5     2     5     9    10  951974.
# 6     8     7     8     8  111319.
# 7     9     8     7     9  246730.
# 8     6     4     5     1  351986.
# 9    10     1     3     7 1024599.
#10     1     9     4     3  745867.
...