r - 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
}
解决方案
您可以尝试一个简单的 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']))
推荐阅读
- java-8 - openjdk:Solaris 11 X86 中的 jdk8u 构建错误
- javascript - JS 在条件句中使用数据属性
- sql - 如何从表中找到回归计数?
- python-3.x - 使用 f 字符串输出 LaTeX 符号
- r - 如何在 R 中选择 data.frame 的最高和最低 10% 值?
- python - 执行 python 程序后隐藏不需要的输出
- arrays - 如何对内部数组的元素求和?(红宝石)
- batch-file - 需要批处理脚本在第二次运行时跳过现有的 .sfv 文件
- nestjs - 如何从 NestJS 控制器返回一个 excel 文件
- angular - Angular 测验应用程序单击相应的问题编号,它应该发出问题