微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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>

我尝试了两种方法

> XML库中的xmlToDataFrame函数
>面向速度的xmlToDF功能发布于here

对于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)
}

对于1000×100 xml记录,这将在大约0.4秒内完成.如果你知道变量名,你甚至可以省略第一个for循环.

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

如果要动态构造data.frame,可以使用data.table执行此操作,data.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秒内完成.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。