使用循环将gmapsdistance应用于R中的列表

时间:2017-04-17 16:28:13

标签: r google-distancematrix-api

我正在尝试使用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)我如何格式化,因此输出是包含原始邮政编码和旅程时间的数据框或矩阵

由于

1 个答案:

答案 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个对象列表,TimeDistanceStatus各一个。然后,您可以轻松地将这些内容转换为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个对象中的列重新组合。