r ggmap: Сообщите mapdist, как классифицировать строки без транзитного значения как NA - PullRequest
1 голос
/ 18 апреля 2019

Я использую функцию mapdist из ggmap, чтобы оценить время прохождения (в секундах) между двумя адресами.

У меня есть набор данных с двумя столбцами, содержащими полные адреса - например, «27 avenue Felix Faure, 75015, Paris» - как для отправной точки, так и для пункта назначения.Моя проблема в том, что иногда API Google Maps Distance не может найти какой-либо выполнимый маршрут с использованием метода транзита.Я не заинтересован в использовании ходьбы, езды на велосипеде или вождения в качестве альтернативы. У меня такой вопрос: как мне указать mapdist назначить "NA" для строк, где не найден возможный маршрут (и, следовательно, время прохождения)?

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

library("ggmap")
register_google(key = "XXXXXX")


from <- testsample$address1
to <- testsample$address2
DF <- cbind(testsample$id, from, to)

DF <- as.data.frame(DF) 
DF$from <- as.character(DF$from) 
DF$to <- as.character(DF$to)     
remove (from, to) 

DF$row.number <- 1:nrow(DF)     

# loop for transit measures ####
for (i in DF$row.number){
  orig <- DF[i,c('from')]
  dest <- DF[i,c('to')]
  a <- mapdist(from = orig, to = dest, mode = "transit", output = "simple")
  a$row.number <- i
  DF$transit_seconds[match(a$row.number, DF$row.number)] <- a$seconds
}

1 Ответ

0 голосов
/ 24 апреля 2019

Вы можете попробовать простой оператор TryCatch (). Включая это, вы можете назначить NA в любое время, когда запрос не будет выполнен, например, потому что не найден правильный маршрут.

Кроме того, вы можете рассмотреть возможность упрощения цикла. Например, с помощью функции apply ().

Вот код:

library("ggmap")
register_google(key = "XXX")


from <- testsample$address1
to <- testsample$address2
DF <- cbind(testsample$id, from, to)

DF <- as.data.frame(DF, stringsAsFactors = FALSE) 
remove (from, to) 

# Function with try catch statement that will either return the transit time in seconds or NA
transit <- function(from, to){
  tryCatch(
    {
      return(mapdist(from = from, to = to, mode = "transit", output = "simple")$seconds)
    },
    error=function(cond) {
      return(NA)
    }
  )
}

# Use apply to iterate over rows of dataframe
DF$transit_seconds <- apply(DF, 1, FUN = function(x) transit(from = x['from'], to = x['to']))

...