当前,在R中将XML文件转换为数据帧最快的方法是什么?
XML如下所示:(注意-并非所有行都具有所有字段)
<row>
<ID>001</ID>
<age>50</age>
<field3>blah</field3>
<field4 />
</row>
<row>
<ID>001</ID>
<age>50</age>
<field4 />
</row>
我尝试了两种方法:
对于一个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.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秒才能完成。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句