Я хочу импортировать следующий XML-документ в фреймы данных: http://opensource.adobe.com/Spry/data/donuts.xml
Должно быть создано 3 фрейма данных:
- Элементы - (Поля = ID Имя типаPPU)
- Batters - (Fields = BatterID, BatterName, ItemID - ключ к фрейму данных Items)
- Toppings - (Fields = ToppingID, ToppingName, ItemID - ключ к фрейму данных Items)
(Данные не обязательно должны быть 3NF - т. Е. Каждый тест может повторяться для каждого элемента, против которого они перечислены)
Используя пакет XML2, я до сих пор использовал следующий код дляимпортируйте XML и преобразуйте его во вложенный список:
library(xml2)
xmlobj <- read_xml("http://opensource.adobe.com/Spry/data/donuts.xml")
ls1 <- as_list(xmlobj) #Converts XML to a nested list
Сейчас я хочу разобрать / сгладить список в 3 фрейма данных, как описано выше.
Как лучше всего добиться этого?Это через серию циклов (lapply / map), передавая объекты в векторы и затем загружая фрейм данных?Или я должен избегать использования XML2 / Lists в целом и использовать пакет XML и достигать этого, используя синтаксис типа XPath?
Я попробовал следующее и мог извлечь атрибуты и элементы Item для одного элемента, но когда япопытался выполнить функцию, в которой произошел сбой:
#Function for pulling out item attributes from list
ItemDF <- function(myItem){
#Gather Item data into DF including attributes
itemFrame <- data_frame(
id = attr(myItem$item,'id'),
type = attr(myItem$item,'type'),
name = unlist(myItem$item$name),
ppu = unlist(myItem$item$ppu)
)
return(itemFrame)
}
#Single instance
df1 <- ItemDF(ls1$items[1])
df1
#Lapply across all items throws an error
lapply(ls1$items,ItemDF)
(NB. Этот набор данных является подтверждением концепции, поэтому я ищу метод, который затем можно адаптировать для других файлов XML, над которыми я ожидаю работать).