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']))
我正在使用 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']))