#r #xml
#r #xml
Вопрос:
используя эти данные всемирного банка: ВВП в текущих долларах США
Я хотел бы создать правильный фрейм данных с помощью XML
пакета в Rstudio Проблема, с которой я столкнулся с методом, xmlToDataFrame
заключается в том, что он не распознал узлы и показал только одно наблюдение с 15576 переменными…
Что касается другого метода, предложенного в stack, мне не удалось создать хороший фрейм данных с именами строк = year и 3 colomn («Страна», «Индикатор», «Значение»)
Заранее спасибо за вашу помощь!
Комментарии:
1. Пожалуйста, опубликуйте образец XML в тексте вопроса, достаточный для того, чтобы распознать шаблон. Не полагайтесь на то, что мы загрузим zip-файл, который не будет доступен будущим читателям.
Ответ №1:
Вы можете сделать следующее
library(XML)
library(tidyverse)
xml <- xmlParse("API_NY.GDP.MKTP.CD_DS2_en_xml_v2_10475111.xml")
Вариант 1
df <- xml %>%
getNodeSet("//record") %>%
map(~setNames(
rbind.data.frame(xmlSApply(.x, xmlValue), stringsAsFactors = F),
xmlSApply(.x, xmlGetAttr, "name"))) %>%
bind_rows()
head(df)
# Country or Area Item Year Value
#1 Aruba GDP (current US$) 1960
#2 Aruba GDP (current US$) 1961
#3 Aruba GDP (current US$) 1962
#4 Aruba GDP (current US$) 1963
#5 Aruba GDP (current US$) 1964
#6 Aruba GDP (current US$) 1965
Нам нужны два xmlSApply
вызова, чтобы получить значения и имена отдельно.
Вариант 2
colnames <- c("Country", "Item", "Year", "Value")
df <- xml %>%
getNodeSet("//record") %>%
xmlToDataFrame() %>%
setNames(colnames)
head(df)
# Country Item Year Value
#1 Aruba GDP (current US$) 1960
#2 Aruba GDP (current US$) 1961
#3 Aruba GDP (current US$) 1962
#4 Aruba GDP (current US$) 1963
#5 Aruba GDP (current US$) 1964
#6 Aruba GDP (current US$) 1965
Мы используем xmlToDataFrame
для принудительного преобразования list
узлов в data.frame
; к сожалению, мы теряем имена полей, поэтому нам нужно добавить имена в качестве имен столбцов пост-hoc способом.