从R中的数据帧生成解析xml树的好方法
假设我有一个数据帧df:从R中的数据帧生成解析xml树的好方法,xml,r,dataframe,Xml,R,Dataframe,假设我有一个数据帧df: df<-data.frame(c("A","B","C","D"), c(1,2,3,10),c(1.0,2.5,3.14,-4)) names(df)<-c("test","foo","bar") 正如前面提到的链接中所述,行似乎没有分开。然而,从技术上讲,这似乎不是真的。当我做一个小蓝宝石: xmlSApply(xmlNode("dataframe",.children=lapply(names(df),function(n){xmlNode(n,df
df<-data.frame(c("A","B","C","D"), c(1,2,3,10),c(1.0,2.5,3.14,-4))
names(df)<-c("test","foo","bar")
正如前面提到的链接中所述,行似乎没有分开。然而,从技术上讲,这似乎不是真的。当我做一个小蓝宝石:
xmlSApply(xmlNode("dataframe",.children=lapply(names(df),function(n){xmlNode(n,df[[n]])}))[[1]], xmlValue)
我得到各个列中的所有值完全分开:
text
[1,] "A"
[2,] "B"
[3,] "C"
[4,] "D"
这将使我能够绘制数据等。然而,当我保存xml结构并重新加载它时,元素之间的分离消失了
我的问题是:
1.)通过这里描述的方法是否可以保存数据,这样我就可以在以后分离元素(当xml树尚未写入硬盘驱动器时,我就可以这样做)
2.)如果不能做到这一点:当我使用Beaterfield()的泛型方法时,如何有效地解析每列
plyr
不是必需的,只需以简单的方式攻击它,而不是尝试使用花哨的apply
构造(它只是一个cpl多行):
库(XML)
谢谢你的建议!如何解析doc中的“foo”和“bar”-值(如果我想在foo上绘制bar)?只需将列转换为.numeric
,就像转换标准data.frame.Ok一样,因此您的方法是重新转换整个xml树并使用它。我确实理解,我在评论中的问题是如何解析xml结构以获得foo和bar列。不,我会像平常一样使用数据帧。您需要将其转换为XML。我只是展示了示例转换是有效的。
text
[1,] "A"
[2,] "B"
[3,] "C"
[4,] "D"
library(XML)
dat <- data.frame(test=c("A", "B", "C", "D"),
foo=c(1, 2, 3, 10),
bar=c(1.0, 2.5, 3.14,- 4))
dat
## test foo bar
## 1 A 1 1.00
## 2 B 2 2.50
## 3 C 3 3.14
## 4 D 10 -4.00
# make a new XML doc
doc <- newXMLDoc()
# add a root node
root <- newXMLNode("datframe", doc=doc)
# build rows/cols
for (i in 1:nrow(dat)) {
row <- newXMLNode("row", parent=root)
for (col in names(dat)) {
newXMLNode(col, dat[i, col], parent=row)
}
}
# verify it worked
xmlToDataFrame(doc)
## test foo bar
## 1 A 1 1
## 2 B 2 2.5
## 3 C 3 3.14
## 4 D 10 -4
# write it out to a file
saveXML(doc, "dataframe.xml")
## [1] "dataframe.xml"