كيفية تحويل بيانات XML إلى data.frame؟
سؤال
أحاول أن أتعلم حرف R XML
طَرد.أحاول إنشاء data.frame من ملف بيانات xml عينة books.xml.إليك ما أحصل عليه:
library(XML)
books <- "http://www.w3schools.com/XQuery/books.xml"
doc <- xmlTreeParse(books, useInternalNodes = TRUE)
doc
xpathApply(doc, "//book", function(x) do.call(paste, as.list(xmlValue(x))))
xpathSApply(doc, "//book", function(x) strsplit(xmlValue(x), " "))
xpathSApply(doc, "//book/child::*", xmlValue)
كل من هذه xpathSApply لا تجعلني أقترب من نيتي.كيف ينبغي للمرء المضي قدمًا نحو إطار بيانات جيد التكوين؟
المحلول
عادة، أود أن أقترح تجربة xmlToDataFrame()
وظيفة، لكنني أعتقد أن هذا سيكون في الواقع أمرًا صعبًا إلى حد ما لأنه ليس منظمًا بشكل جيد في البداية.
أوصي بالعمل مع هذه الوظيفة:
xmlToList(books)
إحدى المشكلات هي أن هناك مؤلفين متعددين لكل كتاب، لذا ستحتاج إلى تحديد كيفية التعامل مع ذلك عند هيكلة إطار البيانات الخاص بك.
بمجرد أن تقرر ما يجب فعله مع مشكلة تعدد المؤلفين، فمن السهل جدًا تحويل قائمة كتبك إلى إطار بيانات باستخدام ldply()
وظيفة في plyr (أو فقط استخدم lapply وقم بتحويل القيمة المرجعة إلى data.frame باستخدام do.call("rbind"...).
إليك مثال كامل (باستثناء المؤلف):
library(XML)
books <- "w3schools.com/xsl/books.xml"
library(plyr)
ldply(xmlToList(books), function(x) { data.frame(x[!names(x)=="author"]) } )
.id title.text title..attrs year price .attrs
1 book Everyday Italian en 2005 30.00 COOKING
2 book Harry Potter en 2005 29.99 CHILDREN
3 book XQuery Kick Start en 2003 49.99 WEB
4 book Learning XML en 2003 39.95 WEB
إليك ما يبدو مع تضمين المؤلف.تحتاج إلى استخدام ldply
في هذه الحالة نظرًا لأن القائمة "خشنة"... لا يستطيع lapply التعامل مع ذلك بشكل صحيح.[وإلا يمكنك استخدام lapply
مع rbind.fill
(أيضًا من باب المجاملة هادلي)، ولكن لماذا تهتم متى plyr
يفعل ذلك لك تلقائيًا؟]:
ldply(xmlToList(books), data.frame)
.id title.text title..attrs author year price .attrs
1 book Everyday Italian en Giada De Laurentiis 2005 30.00 COOKING
2 book Harry Potter en J K. Rowling 2005 29.99 CHILDREN
3 book XQuery Kick Start en James McGovern 2003 49.99 WEB
4 book Learning XML en Erik T. Ray 2003 39.95 WEB
author.1 author.2 author.3 author.4
1 <NA> <NA> <NA> <NA>
2 <NA> <NA> <NA> <NA>
3 Per Bothner Kurt Cagle James Linn Vaidyanathan Nagarajan
4 <NA> <NA> <NA> <NA>