我正在尝试使用R中的gmapsdistance包来计算邮政编码列表(来源)和单个目的地邮政编码之间的公共交通的旅程时间。
单个查询的输出是:
$Time
[1] 5352
$Distance
[1] 34289
$Status
[1] "OK"
我实际上有2.5k的邮政编码可供使用,但我在排除故障时将迭代次数设置为10. london1是一个包含2500列邮政编码的单列的数据框。
这是我迄今为止的尝试;
results <- for(i in 1:10) {
gmapsdistance::set.api.key("xxxxxx")
gmapsdistance::gmapsdistance(origin = "london1[i]"
destination = "WC1E 6BT"
mode = "transit"
dep_date = "2017-04-18"
dep_time = "09:00:00")}
当我运行此循环时,我得到了
结果&lt; - for(i in 1:10){ + gmapsdistance :: set.api.key(“AIzaSyDFebeOppqSyUGSut_eGs8JcjdsgPBo8zk”) + gmapsdistance :: gmapsdistance(origin =“london1 [i]” + destination =“WC1E 6BT” 错误:意外的符号: “gmapsdistance :: gmapsdistance(origin =”london1 [i]“ 目的地” mode =“transit” dep_date =“2017-04-18” dep_time =“09:00:00”)} 错误:“dep_time =”09:00:00“)”
中的意外')'
我的问题是:
1)我该如何解决这个问题?
2)我如何格式化,因此输出是包含原始邮政编码和旅程时间的数据框或矩阵
由于
答案 0 :(得分:2)
这里有一些事情发生:
"london[i]"
需要london[i, 1]
,
"WC1E 6BT"
,我发现有必要用短划线替换空格,例如"WC1E-6BT"
results
所以你的代码看起来像:
library(gmapsdistance)
## some example data
london1 <- data.frame(postCode = c('WC1E-7HJ', 'WC1E-6HX', 'WC1E-7HY'))
## make an empty list to be filled in
results <- vector('list', 3)
for(i in 1:3) {
set.api.key("xxxxxx")
## fill in your results list
results[[i]] <- gmapsdistance(origin = london1[i, 1],
destination = "WC1E-6BT",
mode = "transit",
dep_date = "2017-04-18",
dep_time = "09:00:00")
}
事实证明,在使用gmapsdistance
(参见帮助文档)时,您不需要循环---并且可能不应该 - 并且来自多个输入的输出也有助于快速将输出格式化为data.frame
:
set.api.key("xxxxxx")
temp1 <- gmapsdistance(origin = london1[, 1],
destination = "WC1E-6BT",
mode = "transit",
dep_date = "2017-04-18",
dep_time = "09:00:00",
combinations = "all")
以上内容返回data.frame
个对象列表,Time
,Distance
和Status
各一个。然后,您可以轻松地将这些内容转换为data.frame
,其中包含您可能需要的所有内容:
res <- data.frame(origin = london1[, 1],
desination = 'WC1E-6BT',
do.call(data.frame, lapply(temp1, function(x) x[, 2])))
lapply(temp1, function(x) x[, 2])
从列表中的每个data.frame
中提取所需的列,do.call
将它们作为新data.frame
个对象中的列重新组合。