R快速XML解析

用户名

当前,在R中将XML文件转换为数据帧最快的方法是什么?

XML如下所示:(注意-并非所有行都具有所有字段)

  <row>
    <ID>001</ID>
    <age>50</age>
    <field3>blah</field3>
    <field4 />
  </row>
  <row>
    <ID>001</ID>
    <age>50</age>
    <field4 />
  </row>

我尝试了两种方法:

  1. XML库中xmlToDataFrame函数
  2. 面向速度的xmlToDF函数发布在这里

对于一个8.5 MB的文件(具有1.6k个“行”和114个“列”),xmlToDataFrame用了25.1秒,而xmlToDF用了16.7秒。

与python XML解析器(例如xml.etree.ElementTree)相比,这些时间相当大,后者能够在0.4秒内完成工作。

在R中是否有更快的方法来执行此操作,或者R中是否有某些基本原理阻止我们使此操作更快?

对此有一点帮助会很有帮助!

莱迪

更新了评论

d = xmlRoot(doc)
size = xmlSize(d)

names = NULL
for(i in 1:size){
    v = getChildrenStrings(d[[i]])
    names = unique(c(names, names(v)))
}

for(i in 1:size){
    v = getChildrenStrings(d[[i]])
    cat(paste(v[names], collapse=","), "\n", file="a.csv", append=TRUE)
}

对于1000x100 xml记录,此过程大约需要0.4秒。如果知道变量名,甚至可以省略第一个for循环。

注意:如果xml内容包含逗号,引号,则可能必须特别注意它们。在这种情况下,我建议使用下一种方法。


如果要动态构建data.frame,可以使用进行此操作data.tabledata.table该方法比上述csv方法要慢一些,但比data.frame

m = data.table(matrix(NA,nc=length(names), nr=size))
setnames(m, names)
for (n in names) mode(m[[n]]) = "character"
for(i in 1:size){
    v = getChildrenStrings(d[[i]])
    m[i, names(v):= as.list(v), with=FALSE]
}
for (n in names) m[, n:= type.convert(m[[n]], as.is=TRUE), with=FALSE]

同一份文件大约需要1.1秒才能完成。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章