R: ggmap с функцией mapdist, изменяющей выходные расстояния - PullRequest
1 голос
/ 08 февраля 2020

Ниже приведен воспроизводимый пример, но вам понадобится Google API, чтобы помочь. Вот быстрый пример поведения, которое я вижу.

Учитывая следующий код:

test.1 <- data.frame(rbind("02908", "98144"), c("60612", "60612"),
                     stringsAsFactors = FALSE)
colnames(test.1) <- c("from", "to")
library(ggmap)
Distance <- mapdist(from = test.1$from,
                       to = test.1$to,
                       mode = "driving",
                       output = "simple")
Distance

Получает следующий вывод:

> Distance
# A tibble: 2 x 9
  from  to          m    km miles seconds minutes hours mode   
  <chr> <chr>   <int> <dbl> <dbl>   <int>   <dbl> <dbl> <chr>  
1 02908 60612 3321774 3322. 2064.  109087   1818.  30.3 driving
2 98144 60612 1562693 1563.  971.   53819    897.  14.9 driving

Но когда я вручную выполнить поиск, используя следующее:

mapdist(from = "02908",
        to   = "60612",
        mode = "driving",
        output = "simple")

mapdist(from = "98144",
        to   = "60612",
        mode = "driving",
        output = "simple")

Я получаю следующие выходные данные для каждого:

# A tibble: 1 x 9
  from  to          m    km miles seconds minutes hours mode   
  <chr> <chr>   <int> <dbl> <dbl>   <int>   <dbl> <dbl> <chr>  
1 02908 60612 1562693 1563.  971.   53819    897.  14.9 driving

и

# A tibble: 1 x 9
  from  to          m    km miles seconds minutes hours mode   
  <chr> <chr>   <int> <dbl> <dbl>   <int>   <dbl> <dbl> <chr>  
1 98144 60612 3321774 3322. 2064.  109087   1818.  30.3 driving

Как вы можете видеть, когда Я делаю вызов для каждого «от / до» в отдельности, он точно переворачивается, когда я выполняю вызов с фрейма данных. Или, если говорить точнее, расстояние от «02908» до «60612» = 971 миль, когда я делаю запрос напрямую, и 2064 миль, когда звонок поступает с кадра данных. Хуже того, кажется, что индивидуальный вызов правильный, но вызов с фрейма данных неправильный. И, конечно же, я хочу сделать это для большого количества пар "от / до".

Любая помощь будет очень признательна.

Ответы [ 2 ]

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

Глядя на код из функции mapdist, в коде есть несоответствие. Ошибка ограничивается этими двумя строками кода.
Побочным эффектом от результатов функции split является сортировка "out" кадра данных в порядке столбца "from", который отличается от исходных данных.
Затем функция выполняет обратную сортировку "rev" и выполняет вызовы в Google, но оператор никогда не обновляет расположение фрейма данных from_to_df, что приводит к противоречивым результатам.

   #from the mapdist function:
   out <- split(from_to_df, from_to_df$from) %>% map(~getdists(.x))

   if (output == "all") 
        return(out)
    out %>% rev() %>% map(function(origin) {
        origin %>% map(~tibble(m = .x$distance$value, km = .x$distance$value/1000, 
            miles = 0.0006214 * .x$distance$value, seconds = .x$duration$value, 
            minutes = .x$duration$value/60, hours = .x$duration$value/3600))
    }) %>% flatten() %>% bind_rows() %>% bind_cols(from_to_df, 
        .) %>% mutate(mode = mode)

Чтобы справиться с ошибкой в ​​коде функции легко исправить, предварительно отсортировав фрейм данных перед вызовом функции и, таким образом, избежав побочного эффекта функции перестановки вставленных данных.

test.1 <- bind_rows(split(test.1 , test.1 $from)) %>% arrange(desc(from))
mapdist(test.1$from, test.1$to, mode="driving", output="simple")

Первая строка будет разделена, привязана и отсортируйте строки в правильном порядке для совместимости с текущей версией функции.
Или обновите до самой последней версии ggmap: 3.0.0.901

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

Большое спасибо Бену. Теперь я вижу открытый вопрос. Тем временем, аналогично тому, что я обнаружил в проблемах в Github, я перебрал функцию по каждой строке кадра данных и сшил список обратно в дату. Хотя это неуклюжий, он, кажется, дает ожидаемые результаты.

test.Distance = apply(test.1,
                      1,
                      function(l) {mapdist(from = l[1],
                                           to = l[2])})


test.Distance <- data.frame(matrix(unlist(test.Distance),
                                   nrow = length(test.Distance),
                                   byrow = T))
colnames(test.Distance) <- c("from", "to", "m", "km", "miles", "seconds",
                             "minutes", "hours", "mode")
> test.Distance
   from    to       m       km        miles seconds          minutes            hours    mode
1 02908 60612 1562693 1562.693  971.0574302   53819 896.983333333333 14.9497222222222 driving
2 98144 60612 3321774 3321.774 2064.1503636  109087 1818.11666666667 30.3019444444444 driving
...