用于迭代数据帧行以进行谷歌地图距离查询的 R 代码

2024-04-27

我正在寻求一些帮助,编写一些 R 代码来迭代数据帧中的行,并将每行中的值传递给函数,并将输出打印到 excel 文件、txt 文件或仅在控制台中。

这样做的目的是使用此网站上的功能自动对谷歌地图进行一系列距离/时间查询(数百个):http://www.nfactorialanalytics.com/r-vignette-for-the-week-finding-time-distance- Between-two-places/ http://www.nfactorialanalytics.com/r-vignette-for-the-week-finding-time-distance-between-two-places/

该网站的功能如下:

library(XML)
library(RCurl)
distance2Points <- function(origin,destination){
 results <- list();
 xml.url <- paste0('http://maps.googleapis.com/maps/api/distancematrix/xml?origins=',origin,'&destinations=',destination,'&mode=driving&sensor=false')
 xmlfile <- xmlParse(getURL(xml.url))
 dist <- xmlValue(xmlChildren(xpathApply(xmlfile,"//distance")[[1]])$value)
 time <- xmlValue(xmlChildren(xpathApply(xmlfile,"//duration")[[1]])$value)
 distance <- as.numeric(sub(" km","",dist))
 time <- as.numeric(time)/60
 distance <- distance/1000
 results[['time']] <- time
 results[['dist']] <- distance
 return(results)
}

数据框将包含两列:出发地邮政编码和目的地邮政编码(加拿大,是吗?)。我是一名 R 初学者,所以我知道如何使用 read.table 将 txt 文件加载到数据框中。我只是不确定如何迭代数据帧,每次将值传递给 distance2Points 函数并执行。我认为这可以使用 for 循环或 apply 调用之一来完成?

谢谢您的帮助!

edit:

为了简单起见,假设我想将这两个向量转换为数据帧

> a <- c("L5B4P2","L5B4P2")
> b <- c("M5E1E5", "A2N1T3")
> postcodetest <- data.frame(a,b)
> postcodetest
       a      b
1 L5B4P2 M5E1E5
2 L5B4P2 A2N1T3

我应该如何迭代这两行以从 distance2Points 函数返回距离和时间?


这是一种方法,使用lapply生成一个列表,其中包含数据中每一行的结果并使用Reduce(rbind, [yourlist])将该列表连接到一个数据框中,其行与原始数据框中的行相对应。为了完成这项工作,我们还必须调整原始函数中的代码以返回单行数据帧,所以我在这里完成了这一点。

distance2Points <- function(origin,destination){

  require(XML)
  require(RCurl)

  xml.url <- paste0('http://maps.googleapis.com/maps/api/distancematrix/xml?origins=',origin,'&destinations=',destination,'&mode=driving&sensor=false')
  xmlfile <- xmlParse(getURL(xml.url))
  dist <- xmlValue(xmlChildren(xpathApply(xmlfile,"//distance")[[1]])$value)
  time <- xmlValue(xmlChildren(xpathApply(xmlfile,"//duration")[[1]])$value)
  distance <- as.numeric(sub(" km","",dist))
  time <- as.numeric(time)/60
  distance <- distance/1000
  # this gives you a one-row data frame instead of a list, b/c it's easy to rbind
  results <- data.frame(time = time, distance = distance)
  return(results)
}

# now apply that function rowwise to your data, using lapply, and roll the results
# into a single data frame using Reduce(rbind)
results <- Reduce(rbind, lapply(seq(nrow(postcodetest)), function(i)
  distance2Points(postcodetest$a[i], postcodetest$b[i])))

应用于样本数据时的结果:

> results
        time distance
1   27.06667   27.062
2 1797.80000 2369.311

如果您希望在不创建新对象的情况下执行此操作,您还可以编写单独的函数来计算时间和距离 - 或者将这些输出作为选项的单个函数 - 然后使用sapply要不就mutate在原始数据框中创建新列。使用时可能是这样的sapply:

distance2Points <- function(origin, destination, output){

  require(XML)
  require(RCurl)

  xml.url <- paste0('http://maps.googleapis.com/maps/api/distancematrix/xml?origins=',
                    origin, '&destinations=', destination, '&mode=driving&sensor=false')

  xmlfile <- xmlParse(getURL(xml.url))

  if(output == "distance") {

    y <- xmlValue(xmlChildren(xpathApply(xmlfile,"//distance")[[1]])$value)
    y <- as.numeric(sub(" km", "", y))/1000

  } else if(output == "time") {

    y <- xmlValue(xmlChildren(xpathApply(xmlfile,"//duration")[[1]])$value)
    y <- as.numeric(y)/60

  } else {

    y <- NA    

  }

  return(y)

}

postcodetest$distance <- sapply(seq(nrow(postcodetest)), function(i)
  distance2Points(postcodetest$a[i], postcodetest$b[i], "distance"))

postcodetest$time <- sapply(seq(nrow(postcodetest)), function(i)
  distance2Points(postcodetest$a[i], postcodetest$b[i], "time"))

以下是您可以如何做到这一点dplyr管道与mutate:

library(dplyr)

postcodetest <- postcodetest %>%
  mutate(distance = sapply(seq(nrow(postcodetest)), function(i)
           distance2Points(a[i], b[i], "distance")),
         time = sapply(seq(nrow(postcodetest)), function(i)
           distance2Points(a[i], b[i], "time")))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于迭代数据帧行以进行谷歌地图距离查询的 R 代码 的相关文章

  • 从命令行运行 R 代码 (Windows)

    我在名为 analysis r 的文件中有一些 R 代码 我希望能够从命令行 CMD 运行该文件中的代码 而无需通过 R 终端 并且我还希望能够传递参数并在我的代码中使用这些参数 例如就像下面的伪代码 C gt execute r scri
  • 为什么 dplyr filter() 不能在函数内工作(即使用变量作为列名)?

    使用 dplyr 函数对数据进行过滤 分组和变异的函数 基本管道序列在函数之外工作得很好 这就是我使用真实列名称的地方 将其放入一个函数中 其中列名称是一个变量 并且某些函数可以工作 但有些函数则不能 尤其是 dplyr filter 例如
  • 在 R 格子包中微调点图

    我正在尝试为不同的数据集和不同的算法绘制一堆 ROC 区域 我有三个变量 方案 指定所使用的算法 数据集 是正在测试算法的数据集 以及 Area under ROC 我正在 R 中使用lattice库 命令如下 点图 方案 Area und
  • Purrr::map_df() 删除 NULL 行

    使用时purrr map df 我偶尔会传递一个数据框列表 其中一些项目是NULL 当我做 map df 返回行数少于原始列表的数据框 我想发生的事情是这样的map df calls dplyr bind rows 它忽略了NULL价值观
  • 在 R 中使用 lapply 绘制多个数据帧

    我正在尝试使用 lapply 函数绘制多个数据帧 每个数据帧一个图 但是尽管有关此主题的所有帖子我都找不到答案 因为我不断收到错误 图的输出列表为空 我的数据结构如下 df1 lt mtcars gt group by cyl gt tal
  • 在循环中每次迭代开始时将变量重新分配给原始值(在循环之前定义)

    在Python中 你使用 在每次迭代开始时将变量重新分配给原始值 在循环之前定义 时 也就是说 original 1D o o o for i in range 0 3 new original 1D revert back to orig
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 将数据框中重叠的范围合并到唯一的组中

    我有一个 n 行 3 的数据框 df lt data frame start c 178 400 983 1932 33653 end c 5025 5025 5535 6918 38197 group c 1 1 2 2 3 df sta
  • ddply 和aggregate 之间的区别

    有人可以通过以下示例帮助我了解聚合和 ddply 之间的区别 数据框 mydat lt data frame first rpois 10 10 second rpois 10 10 third rpois 10 10 group c re
  • 基于时间窗口的不规则时间序列的优化滚动函数

    有没有办法使用 rollapply 来自zoo包或类似的东西 优化功能 rollmean rollmedian等 使用基于时间的窗口计算滚动函数 而不是基于大量观察的函数 我想要的很简单 对于不规则时间序列中的每个元素 我想计算一个具有 N
  • 通过数据框与函数进行交互

    如果我有这样的日期框架 氮 EG 00 04 NEG 04 08 NEG 08 12 NEG 12 16 NEG 16 20 NEG 20 24 datum von 2017 10 12 21 69 15 36 0 87 1 42 0 76
  • 在 Pandas DataFrame Python 中添加新列[重复]

    这个问题在这里已经有答案了 例如 我在 Pandas 中有数据框 Col1 Col2 A 1 B 2 C 3 现在 如果我想再添加一个名为 Col3 的列 并且该值基于 Col2 式中 如果Col2 gt 1 则Col3为0 否则为1 所以
  • 旋转 Markdown 的表格 pdf 输出

    我想将 pdf 上的表格输出旋转 90 度 我正在使用 Markdown 生成报告并kable循环显示表格 如果可以的话我想继续使用kable因为还有很多其他依赖于它的东西我没有包含在这个 MWE 中 这是一个简单的例子 使用iris数据集
  • 使用 ggmap 截断密度多边形

    我在使用 R ggmap 绘制密度图时遇到问题 我的数据如下所示 gt head W date lat lon dist 1 2010 01 01 31 942 86 659 292 415 2 2010 01 10 32 970 84 1
  • 如何从 R 读取 PDF 元数据

    我们很好奇 有没有一种方法可以从 R 读取 PDF 元数据 例如下面显示的信息 通过搜索我对此无能为力 r pdf metadata在当前的问题库中 非常欢迎任何指点 我想不出纯 R 的方法来执行此操作 但您可能可以安装您最喜欢的 PDF
  • R:使用 tidyverse 将 NA 替换为 df 中的其他变量

    我想使用 tidyverse 替换 df 中的 NA 值 我想要的值应该从其他列中计算出来 input ID X1 X2 X3 A 0 96 NA 0 97 B 1 00 NA 1 01 C 0 98 0 03 NA A 1 00 NA 1
  • 如何绘制具有显着性水平的箱线图?

    前段时间问了一个关于绘制箱线图的问题Link1 https stackoverflow com questions 14604439 plot multiple boxplot in one graph 我有一些包含 3 个不同组 或标签
  • Shiny:动态数据框构建; renderUI、观察、reactiveValues

    我认为如何使用 Shiny 的 renderUI 功能动态子集数据的问题经常出现 但我很难理解何时使用 renderUI 带有 uiOutput 而不是其他功能 包括观察 反应 反应值甚至条件面板 我想构建一个完全交互式的数据框架 其中每个
  • 如何使用 tidymodels 和工作流集在同一数据集上拟合多个不同的线性模型

    我想评估同一数据集上多个 主要是 线性回归模型的性能 我想也许使用tidymodels包连同workflowsets workflow set 可能会起作用 我按照这个例子here https workflowsets tidymodels
  • 线性判别分析图

    如何将样本 ID 行号 作为标签添加到此 LDA 图中的每个点 library MASS ldaobject lt lda Species data iris plot ldaobject panel function x y points

随机推荐

  • 打开页面时出现问题(许可协议页面)

    我很困扰 如何在使用应用程序时仅显示一次协议页面 我不知道如何解释这一点 但我正在尝试解释这一点 我正在创建一个应用程序 其中有协议页面 其中有两个按钮 1 按钮名称为Accept 2 按钮名称为拒绝 如果用户单击接受按钮应用程序进入下一页
  • DDMS 显示在线模拟器的空文件资源管理器

    我很多天都面临这个问题 我搜索了很多但没有找到任何方便的答案 每当我启动模拟器时 一段时间后 当我看到 DDMS 时 它会显示模拟器在线 但其文件资源管理器什么也不显示 当我再次重新启动模拟器或重新启动 Eclipse 时 它 会再次可见
  • 有完整的 tomcat 角色列表吗?

    我希望能够完全访问和控制 tomcat 以使我的开发生活变得简单 我知道角色 admin 和 manager 并且知道还有一些带有连字符的角色 例如 manager gui 但在哪里可以找到包含可用角色描述的完整列表 我什至无法在文档中找到
  • 使用 Python 从 PDF 中的物理坐标返回文本字符串

    在过去的几个小时里 我一直在与 Google 和 PDFMiner 的有限文档作斗争 虽然我感觉很接近 但我只是没有得到我需要的东西 我已经经历过http www unixuser org euske python pdfminer htt
  • 简单的 XML 加载文件不起作用

    为什么这不起作用 url http query yahooapis com v1 public yql q select 20 20from 20html 20where 20xpath 3D 22 2F 2Fmeta 22 20and 2
  • Docker nuget连接超时

    尝试利用官方jetbrains teamcity agentKubernetes 上的图像 我已经设法在 Docker 中运行 Docker 但尝试使用以下命令构建 ASP NET Core 映像docker build命令失败于dotne
  • SetLocale 无法在 jsp 站点中以德语格式化货币

    我对 jstl 标签库感到困惑 我想将数字格式化为德国风格的货币 但我尝试的一切都不起作用 我找到了以下示例 但输出是相同的
  • 如何根据 angular.js 中的子复选框选择父复选框?

    我最近一直在使用 Angular js 并决定在选中父复选框后检查所有复选框 我已经使用了ng model and ng checked指令 div div div div
  • Hibernate 本机查询:无效的列名错误 SQL-17006

    package com abc def model import javax persistence Column import javax persistence Id import javax persistence Entity im
  • 在Angular JS中通过ajax调用发送数组

    我使用以下代码将一些信息发送到我的 servlet 来处理数据 http method GET url http localhost 8080 purchase AddInfo data addArray sample success fu
  • “for_each”值取决于无法确定的资源属性(Terraform)

    我有一个 terraform 配置 需要 创建一个 lambda 调用 lambda 迭代 lambda 的 json 结果 返回一个数组并为数组中的每个条目创建一个 CloudWatch 事件规则 相关代码如下 Create lambda
  • PHP GD库用于合并两个图像

    好的 我的文件中有两个图像 其中一件是T恤 另一个是徽标 我使用 CSS 设计了这两个图像的样式 使其看起来像徽标写在 T 恤上 我只是在 CSS 样式表中为徽标图像赋予了更高的 z index 无论如何 我是否可以使用 GD 库生成衬衫图
  • 对 Angular 2 中提供的 @NgModule 感到困惑

    我正在尝试玩 Angular2 当我将基本代码升级到 Angular 2 0 0 RC5 时 我发现引入了一个重大更改 NgModule 它相当于角度模块 在 Angularjs 1 x 中 对我来说 ngModule 让事情变得复杂 当我
  • Jquery Validate:如何忽略占位符文本(默认/空白时产生错误)

    我想让 jquery 验证忽略默认文本 我检查默认文本的方法是检查 element value 元素 alt 文本 这是我的代码 但无论它是空白 默认文本还是任何其他文本 它都会返回无效 validator addMethod notDef
  • 点击Leaflet地图上的点即可在Shiny中生成ggplot

    我正在尝试使用 R 中的 Shiny 创建一个 Leaflet 地图 它允许用户单击任何标记来生成表示该特定站点的信息 温度 的相应图 我合并了这个问题的代码 单击传单地图中的点作为闪亮绘图的输入 https stackoverflow c
  • 主要:并非所有代码路径都会返回值

    我正在制作列表并想在控制台中查看它 我有一个错误 它说 Main 并非所有代码路径都会返回值 也许你可以帮助我 这是我的代码 namespace ConsoleApplication5 public class DocConfig publ
  • C# 控制台应用程序上的退出按钮 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 大家好 我敢打赌我真的很蠢 你能帮我消除这些错误吗 抱歉 我是一名刚刚学习 C 的学生 我需要声明任何变量来纠正逻辑吗 void Windo
  • 位运算 (C++)

    最近面试时遇到一个问题 我被要求比较按位运算的性能 比如 简单描述一下不同位操作的性能 我想这个问题可能非常普遍并且非常特定于机器 但我也认为应该有一些关于这个的一般规则 你必须提到 我没有 那么 你会回答什么 我可能还应该说 比较它们在
  • 使用 javascript 过滤二维数组

    我有一个 2D 数组 我需要过滤具有日期字段 3d 列 的行 var data 1 a 12 12 2019 A 2 b A 3 c 12 1 2019 A 4 d A 预期结果是 result 1 a 12 12 2019 A 3 c 1
  • 用于迭代数据帧行以进行谷歌地图距离查询的 R 代码

    我正在寻求一些帮助 编写一些 R 代码来迭代数据帧中的行 并将每行中的值传递给函数 并将输出打印到 excel 文件 txt 文件或仅在控制台中 这样做的目的是使用此网站上的功能自动对谷歌地图进行一系列距离 时间查询 数百个 http ww