r ggmap:告诉 mapdist 如何将没有传输值的行分类为 NA

r ggmap: Tell mapdist how to classify rows with no transit value as NA

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

我有一个包含两列的数据集,其中包含起点和目的地的完整地址,例如“27 avenue Felix Faure, 75015, Paris”。我的问题是,有时 Google 地图距离 API 无法使用中转方法找到任何可行的路线。我对步行、骑自行车或开车作为替代方案不感兴趣。 因此,我的问题是:我如何指定 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
}

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