在R中解析XML
我试图从XML文件中下载和组织一些数据到R中。我查看了相关的问题和文档,但大多数人都提到使用xml包解析函数,这似乎不是能够弄清楚我的数据。所以我的两个问题是1)如何让R将实际数据读入数据框而不是XML结构并标记出来?和2)我可以使用XML代码中的XML结构信息来解析它在R中吗?在R中解析XML
这是我与工作(和我的失败尝试至今):
library("XML")
datahere = c("C:/.../R/feddata/data/")
setwd(datahere)
download.file("http://www.newyorkfed.org/markets/pomo/xml/v3_0/pomoXML.cfm?SHOWMORE=TRUE&date1=01/01/2009&date2=01/10/2009",paste(datahere,"feddata.xml",sep=""))
feddata = xmlInternalTreeParse("feddata.xml")
feddataset = xmlRoot(feddata)
names(feddata)
feddatanodeset = getNodeSet(feddata,"//DataSet/*")
feddatalist = xmlToList("feddata.xml")
feddatalist[2][1][1]
feddataDF = xmlToDataFrame(feddata)
feddata$doc$file$DataSet
feddata["doc"]["file"]["DataSet"]
feddataRoot = xmlRoot(feddata)
feddata2 = xmlSApply(feddata, function(x) xmlSApply(x,xmlValue))
feddata2 = xmlSApply(feddata$DataSet, function(x) xmlSApply(x,xmlValue))
想法,建议,意见,等等都极大的赞赏。如果你知道另一个堆栈问题,或者某个地方可以使用的教程或示例,那也可以工作,不想冗余。谢谢!
这是你想要的吗?
library(XML)
datahere = "~/"
setwd(datahere)
download.file("http://www.newyorkfed.org/markets/pomo/xml/v3_0/pomoXML.cfm?SHOWMORE=TRUE&date1=01/01/2009&date2=01/10/2009",paste(datahere,"feddata.xml",sep=""))
tt = xmlParse("feddata.xml")
out <- getNodeSet(tt, "//*[name()='out:issue']", fun=xmlToList)
df <- data.frame(do.call(rbind, out))
head(df)
confidentiality couponRate currency decimals inclusion maturityDate multiplier rate securityType status
1 F 4.750 USD 0 true 2011-01-18 0 P FMC A
2 F 4.500 USD 0 true 2011-02-15 0 P FNM A
3 F 4.625 USD 0 true 2011-02-18 0 P FHL A
4 F 3.250 USD 0 true 2011-02-25 0 P FMC A
5 F 5.500 USD 0 true 2011-03-15 0 P FNM A
6 F 5.625 USD 0 true 2011-03-15 0 P FMC A
value
1 40000000
2 3000000
3 2000000
4 0
5 49000000
6 155000000
啊,我试过这种方法,但无法让do.call(rbind)工作。这很有帮助,因为我可以看到我做错了什么,这主要是不了解xml文件本身的组织。谢谢! – DaedalusBloom
奇怪的是,'do.call'和'rbind'是基于R – sckott
噢,我不是说这些函数有问题,我的意思是我没有正确使用它们。更具体地说,当试图解析XML时,文件顶部不是数据观察的信息显然不能被观察到。基本上我真的不知道如何正确导航XML,这是你用“// * [name()='out:issue']”步骤澄清的。我确定这是我对XML结构缺乏经验的原因,但对于您的示例来说,它很有启发性。再次感谢! – DaedalusBloom
使用plyr
和XML
另一种解决方案
library(XML)
doc <- xmlParse(
"http://www.newyorkfed.org/markets/pomo/xml/v3_0/pomoXML.cfm?SHOWMORE=TRUE&date1=01/01/2009&date2=01/10/2009"
)
doc_list <- xmlToList(doc)
library(plyr)
doc_issues <- ldply(doc_list$DataSet$Group, function(d){
if ("issue" %in% names(d)){
d$issue
} else {
NULL
}
})
这也有窍门。我需要更熟悉plyr软件包,但我从来没有真正知道何时想到它。谢谢一堆! – DaedalusBloom
哪些信息你尝试从该XML文档中提取? – agstudy
我只是想像Scott和Ramnath那样得到数据的数据观察结果。我会试着在未来的问题上更具体一些,但我认为这是在这方面做出新的努力的困难之一 - 并不知道要问的正确问题。 – DaedalusBloom