在 R 中将多个 XML 文件合并到一个数据框中

2024-01-15

我有许多 XML 文件(大约 100,000 个),它们都如下所示。每个文件大约有 100 个点节点。我只展示其中五个以供说明。

<?xml version="1.0" encoding="UTF-8"?>
-<car id="id1">
<point time="1272686841" lon="-122.40648" lat="37.79778" status="E" unit="id1"/>
<point time="1272686781" lon="-122.40544" lat="37.79714" status="M" unit="id1"/>
<point time="1272686722" lon="-122.40714" lat="37.79774" status="M" unit="id1"/>
<point time="1272686661" lon="-122.40704" lat="37.7976" status="M" unit="id1"/>
<point time="1272686619" lon="-122.40616" lat="37.79698" status="E" unit="id1"/>
</car>

我想将所有这些 XML 文件合并到 R 中的一个大数据框架(大约 100,000x100=10,000,000 行)中,其中有五列(时间、经度、纬度、单位、状态)。所有文件都有相同的五个变量,但它们的顺序可能不同。

以下是我的代码。我首先创建五个向量来保存这五个变量。然后我去每个文件,一一阅读条目。

setwd("C:\\Users\\MyName\\Desktop\\XMLTest")
all.files <- list.files()
n <- 2000000
all.lon <- rep(NA, n)
all.lat <- rep(NA, n)
all.time <- rep(NA, n)
all.status <- rep(NA, n)
all.unit <- rep(NA, n)
i <- 1
for (cur.file in all.files) {
  if (tolower(file_ext(cur.file)) == "xml") {
    xmlfile <- xmlTreeParse(cur.file)
    xmltop <- xmlRoot(xmlfile)
    for (j in 1:length(xmltop)) {
      cur.node <- xmltop[[j]]
      cur.lon <- as.numeric(xmlGetAttr(cur.node, "lon"))
      cur.lat <- as.numeric(xmlGetAttr(cur.node, "lat"))
      cur.time <- as.numeric(xmlGetAttr(cur.node, "time"))
      cur.unit <- xmlGetAttr(cur.node, "unit")
      cur.status <- xmlGetAttr(cur.node, "status")
      all.lon[i] <- cur.lon
      all.lat[i] <- cur.lat
      all.time[i] <- cur.time
      all.status[i] <- cur.status
      all.unit[i] <- cur.unit
      i <- i + 1
    }
  }
}

我是 XML 新手,所以这是我现在能做的最好的事情。问题是它非常慢。原因之一是文件太多。另一个原因是for loop for (j in 1:length(xmltop))阅读条目。我试过xmlToDataFrame但它不起作用。

> xmlToDataFrame(cur.file)
Error in matrix(vals, length(nfields), byrow = TRUE) : 
  'data' must be of a vector type, was 'NULL'

有什么方法可以加快这个过程吗?


考虑一个lapply()解决方案可能会加速文件迭代。由于所有数据都驻留在属性中,因此您可以使用 XMLxPathSApply()一通电话。

library(XML)

setwd("C:\\Users\\MyName\\Desktop\\XMLTest")
all.files <- list.files(pattern="\\.xml", path=getwd(), full.names=TRUE)

dfList <- lapply(all.files, function(x){
  xml <- xmlParse(x)
  pointAttribs <- xpathSApply(doc=xml, path="//point",  xmlAttrs)
  # TRANSPOSE XPATH LIST TO DF 
  df <- data.frame(t(pointAttribs))
  # CONVERT TO NUMERIC
  df[c('time', 'lon', 'lat')] <- sapply(df[c('time', 'lon', 'lat')], 
                                        function(x) as.numeric(as.character(x)))
  return(df)
})

df <- do.call(rbind, dfList)
df
#          time       lon      lat status unit
# 1  1272686841 -122.4065 37.79778      E  id1
# 2  1272686781 -122.4054 37.79714      M  id1
# 3  1272686722 -122.4071 37.79774      M  id1
# 4  1272686661 -122.4070 37.79760      M  id1
# 5  1272686619 -122.4062 37.79698      E  id1
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 R 中将多个 XML 文件合并到一个数据框中 的相关文章

随机推荐

  • 如何使用预处理器指令区分编译器的版本

    有没有办法区分使用预处理器指令的编译器版本 我在使用新的 Roslyn 编译器时遇到了问题 它生成的代码与旧编译器不同 我需要保持代码与使用 Visual Studio 2013 和 2015 的团队兼容 None
  • 从角度工厂中的 $resource 响应获取数据

    我有这个工厂 factory Member function resource var endpoint http some valid url function generateMemberToken id1 id2 return res
  • 有没有一种简单的方法可以在文本框中进行单击并拖动滚动?

    我有一个 divoverflow auto和滚动条 我希望能够拖动内容进行滚动 我不需要能够选择文本 是否有捷径可寻 一个 jQuery 插件会很好 否则普通的 JavaScript 就可以了 看来我自己说得还不够清楚 有一个具有固定高度的
  • 检查 API 是否受到监控(挂钩?)

    我的应用程序使用一些 API 例如GetProcAddress and CreateProcess这有时会导致防病毒软件将其标记为恶意软件 即使它不是恶意软件 我想做的是检查特定的 API 是否正在被监视或挂钩 如果是 那么我不会调用该部分
  • 远程登录亚马逊(KDP)

    我想自动化 KDP Kindle 桌面出版 的摘要 由于他们似乎没有任何电子邮件通知系统 至少我不知道 我需要通过curl 登录 但这让我发疯 我在用着简单的htmldom http simplehtmldom sourceforge ne
  • 从 .fits 文件构造 pandas 数据框

    我有一个包含数据的 fits 文件 我想从这个特定文件构建一个 pandas 数据框 但我不知道该怎么做 data fits open datafile data info gives No Name Type Cards Dimensio
  • 使用 h5py 压缩现有文件

    我目前正在开展一个有关 HDF5 数据集压缩的项目 最近开始使用 h5py 我遵循了基本教程 并且能够在创建文件时打开 创建和压缩文件 然而 在压缩现有文件时我一直不成功 这是我工作的目的 我尝试使用 r 打开文件 然后压缩分块数据集 但文
  • 使用 Atmosphere 仅向一位客户端广播

    如何使用 Atmosphere Meteor 将消息从一个客户端广播到另一个客户端 我目前有一个基于 Meteor 教程的实现 Override public void doGet HttpServletRequest req HttpSe
  • 允许进程自动继续的消息框

    我希望显示一个消息框 并且程序继续运行 而不是等待我在此消息框中单击 确定 能做到吗 else Debug or messagebox the line that fails MessageBox Show Cols columns Len
  • Botframework v4:Stepcontext 选项

    您好 有人可以解释一下如何使用瀑布stepcontext Option吗 我一直在示例中看到它 但我不太明白如何使用它 以下是来自的示例 and 我计划重构我的整个代码 并且如果可能的话希望使用此选项 感谢 private static a
  • python threading.Timer立即启动而不是在指定时间

    我想每 3 秒执行一个函数 如果我调用一个不带参数的函数 代码将有效 如下所示 def mytempfunc print this is timer threading Timer 5 mytempfunc start 但是如果我调用一个带
  • 如何在无需用户干预的情况下启用 Chrome 扩展(以编程方式)

    我制作了一个 chrome 扩展 并希望将其安装作为使用 Windows 注册表的软件安装设置的一部分来完成 它安装了 chrome 扩展 但处于禁用状态 扩展程序列在 chrome extensions 中已安装的扩展程序列表中 如何使用
  • python跨不同文件的多处理

    试图更好地理解这一点 https pymotw com 2 multiprocessing basics html https pymotw com 2 multiprocessing basics html 我有 20 多个 大 日志 每
  • RabbitMQ“确认”模式下通道的行为

    我在理解 RabbitMQ 的确认时遇到了一些困难 我看到 RabbitMQ 的以下解释 Notes 如果代理在上述之前崩溃 则会丢失持久消息 消息被写入磁盘 在某些条件下 这会导致 经纪人的行为方式令人惊讶 例如 考虑这个 设想 客户端将
  • PHP 异或字符串

    我看到这段代码来自PPCG 上的回答 https codegolf stackexchange com a 53633 22867 echo BeeABBeeoBodBaBdOdPQBBgDQgDdp n n t8b n n t nb nb
  • 如何指定 Html.TextBox 帮助程序的属性,同时维护从 ViewData 检索值?

    我正在使用 Html TextBox 助手来创建文本框 我想在文本框上设置属性 据我所知 这是使用以下重载完成的 Html TextBox string name object value object htmlAttributes 但是
  • ASP.NET MVC 5 不渲染 jQuery UI CSS 包

    我正在尝试将 jQuery UI CSS 主题包包含在我的项目中 我的文件夹里有所有需要的文件 Content themes目录 并设置我的BundleConfig cs如下 public class BundleConfig For mo
  • Apache CXF Web 服务问题

    我有一个使用 Maven 的多模块项目 在其中一个模块上 我有几个使用 Apache CXF Framework 2 5 4 开发的 Web 服务 目前我有两个 问题 或疑问 首先 如果我调用应返回列表的 Web 服务之一的方法 如果列表为
  • “this”关键字似乎不起作用

    我试图理解如何this关键字在 JavaScript 中有效 我制作了这个脚本 function click this innerHTML changed 在此 HTML 中使用
  • 在 R 中将多个 XML 文件合并到一个数据框中

    我有许多 XML 文件 大约 100 000 个 它们都如下所示 每个文件大约有 100 个点节点 我只展示其中五个以供说明