создайте правильный фрейм данных с помощью XML-файла на R

#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 способом.