2015-01-11 3 views
3

У меня есть первый переход на преобразование XML в файл R. data.frame и найти такие вопросы, как этот: How to transform XML data into a data.frame? очень полезен, но все еще неспособен преобразовать мою часть XML в data.frame.Проблема с созданием data.frame из файла xml

Моя цель - сделать график обменного курса евро к доллару США с течением времени. Данные приведены здесь в формате XML:

http://www.ecb.europa.eu/stats/exchange/eurofxref/html/usd.xml

Я могу прочитать в данных и показывает, какую часть данных (узел?) Я заинтересован в:

library(XML) 
doc <- xmlTreeParse("http://www.ecb.europa.eu/stats/exchange/eurofxref/html/usd.xml") 
root <- xmlRoot(doc) 
root[[2]][[2]] 

Я пробовал вариацию getNodeSet(), чтобы показать все строки, которые начинаются с, но ГНФАРОМ без толка:

getNodeSet(root, "/DataSet/Series/*") 
getNodeSet(root, "//obs") 
getNodeSet(root, "//obs[@OBS_VALUE = 1.1789]") 

Как я могу идти о извлечь все или переменные TIME_PERIO D и OBS_VALUE из этого XML-файла и помещены в R data.frame? Спасибо уже за любые комментарии или разъяснения.

+1

ТВН, я не знаю, почему Подменю по XPaths не Работа (?). Эзотерическим решением может быть 't (sapply (xmlChildren (xmlRoot (doc) [[2]] [[2]]), xmlAttrs))'. – lukeA

+0

Спасибо @lukeA, это действительно полезно. – Richard

ответ

4

Данные приведены в формате sdmx. Вы можете использовать R пакет rsdmx для анализа данных:

library(rsdmx) 
appData <- readSDMX("http://www.ecb.europa.eu/stats/exchange/eurofxref/html/usd.xml") 
myData <- as.data.frame(appData) 

> head(myData) 
FREQ CURRENCY CURRENCY_DENOM EXR_TYPE EXR_SUFFIX TIME_FORMAT COLLECTION TIME_PERIOD OBS_VALUE OBS_STATUS OBS_CONF 
1 D  USD   EUR  SP00   A   P1D   A 1999-01-04 1.1789   A  F 
2 D  USD   EUR  SP00   A   P1D   A 1999-01-05 1.1790   A  F 
3 D  USD   EUR  SP00   A   P1D   A 1999-01-06 1.1743   A  F 
4 D  USD   EUR  SP00   A   P1D   A 1999-01-07 1.1632   A  F 
5 D  USD   EUR  SP00   A   P1D   A 1999-01-08 1.1659   A  F 
6 D  USD   EUR  SP00   A   P1D   A 1999-01-11 1.1569   A  F 

В качестве альтернативы, если вы просто пакет XML в руки:

doc <- xmlParse("http://www.ecb.europa.eu/stats/exchange/eurofxref/html/usd.xml") 
docData <- getNodeSet(doc, "//ns:Obs" 
         , namespaces = c(ns = "http://www.ecb.europa.eu/vocabulary/stats/exr/1") 
         , fun = xmlAttrs) 
docData <- do.call(rbind, docData) 
> head(docData) 
TIME_PERIOD OBS_VALUE OBS_STATUS OBS_CONF 
[1,] "1999-01-04" "1.1789" "A"  "F"  
[2,] "1999-01-05" "1.1790" "A"  "F"  
[3,] "1999-01-06" "1.1743" "A"  "F"  
[4,] "1999-01-07" "1.1632" "A"  "F"  
[5,] "1999-01-08" "1.1659" "A"  "F"  
[6,] "1999-01-11" "1.1569" "A"  "F" 
+0

О, мой, в разы, подобные этим, я так люблю R;) Большое спасибо @jdharrison! – Richard

+0

С удовольствием помогите ... – jdharrison

+1

Спасибо @jdharrisson за обмен этим примером. Я также рекомендую взглянуть на документацию проекта rsdmx https://github.com/opensdmx/rsdmx/wiki, в которой приводятся дополнительные примеры того, как вы используете rsdmx. Надеюсь это поможет – eblondel

Смежные вопросы