首页 > 解决方案 > r ggmap:告诉 mapdist 如何将没有中转值的行分类为 NA

问题描述

我正在使用 ggmap 中的 mapdist 函数来评估两个地址之间的传输时间(以秒为单位)。

我有一个数据集,其中两列包含完整地址 - 例如“27 avenue Felix Faure, 75015, Paris” - 用于起点和目的地。我的问题是,有时 Google Maps Distance API 使用中转方法找不到任何可行的行程。我对使用步行、骑自行车或开车作为替代方案不感兴趣。因此,我的问题是:如何指定 mapdist 将“NA”分配给未找到可行行程(以及运输时间)的行?

当我使用驱动方法时,下面的代码有效。因此,问题在于 GGMAPs 找不到可行行程的起点组合。

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
}

标签: rmissing-dataggmap

解决方案


您可以尝试一个简单的 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']))


推荐阅读