سؤال

أحاول أن أتعلم حرف 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>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top