【发布时间】:2017-01-14 15:54:21
【问题描述】:
我有一个包含起点和终点(纬度和经度)的大量 data.frame,并且我正在使用 taRifx.geo 包中的 georoute 函数来了解开车需要多远和多长时间A 到 B。
数据看起来像这样(latlon 和 latlon_end 都是 characters 的类:
> LL[1:10,14:15]
latlon latlon_end
1 52.481466 13.317647 52.518811 13.413034
2 52.518811 13.413034 52.504182 13.318051
3 52.504182 13.318051 52.502236 13.305396
4 52.502236 13.305396 52.548096 13.355104
5 52.548096 13.355104 52.569865 13.410967
6 52.569865 13.410967 52.54505 13.419071
7 52.54505 13.419071 52.527736 13.378182
8 52.527736 13.378182 52.495678 13.343019
9 52.495678 13.343019 52.496712 13.341767
10 52.496712 13.341767 52.458631 13.32529
这是我为此目的编写的for 循环:
for(i in 38753:100000){
DT[i,]=tryCatch(t(as.matrix(unlist(georoute( c(as.character(LL$latlon[i]),
as.character(LL$latlon_end[i])),
verbose=TRUE, returntype=c("time", "distance"))),
nrow = 1, ncol = 2)),
error=function(a) {"."} )
}
这里的基本函数,georoute 基本上给出了两个元素的列表,time 和 distance,这就是为什么我必须在将它们全部绑定到数据框之前先取消列出它们。对于trycatch 函数,这是为了处理georoute 的偶发错误,我不知道我该怎么做..
我确实尝试了很多方法,但似乎只有这个对我有用,因为不知何故 这个georoute 函数似乎一次只需要一对 latlon 和 latlon_end所以我必须逐行做这件事。然而,由于有几十万个条目,我需要几天甚至几周的时间来处理所有这些数据。我知道我应该加入package and understand the codes behind(link inserted),这样我就知道什么更适合这个目的,但是脚本对于我的水平来说太高级了,我什至不知道我要在脚本中寻找什么精确的。我想我可以为此使用 lapply 函数,但我无法让它工作。
任何帮助或提示或想法将非常非常非常非常感谢!
ps。更新原始georoute 返回
> georoute(c(as.character(LL$latlon[1]), as.character(LL$latlon_end[1])), verbose = FALSE, returntype = c("time","distance"))
distance time
1 9.03 1338
> georoute(c(as.character(LL$latlon[1:3]), as.character(LL$latlon_end[1:3])), verbose = FALSE, returntype = c("time","distance"))
distance time
1 35.599 5275
> class(georoute(c(as.character(LL$latlon[1]), as.character(LL$latlon_end[1])), verbose = FALSE, returntype = c("time","distance")))
[1] "data.frame"
我认为返回的 distance 和 time 是数字,因为它的摘要显示了 4 个分位数、平均值、中位数等。
【问题讨论】:
-
我无法想象 for 循环是这里的瓶颈。我不熟悉 georoute 但实际上它必须花费很长时间才能找到两点之间的路线。如果允许的话,并行版本可能是唯一的解决方案。