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

问题描述 投票:1回答:1

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

我有一个包含完整地址的两列的数据集 - 例如“27 avenue Felix Faure,75015,Paris” - 用于起点和终点。我的问题是,有时Google Maps Distance 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
}
r missing-data ggmap
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.