2015-09-30 4 views
5

मैं कुछ डेटा इसी प्रकार की आकृति है:लोड एक्सएमएल आर डेटा तालिका में "पंक्तियाँ"

first last sex height 
1 Mary Jane F  NA 
2 Susan Smith F 168 
3 Joseph Black M  NA 
4 Jessica Jones F  NA 

मैं इस मिल गया है:

<people> 
    <person first="Mary" last="Jane" sex="F" /> 
    <person first="Susan" last="Smith" sex="F" height="168" /> 
    <person last="Black" first="Joseph" sex="M" /> 
    <person first="Jessica" last="Jones" sex="F" /> 
</people> 

मैं एक डेटा फ्रेम कि इस तरह दिखता है चाहते हैं दूर:

library(XML) 
xpeople <- xmlRoot(xmlParse(xml)) 
lst <- xmlApply(xpeople, xmlAttrs) 
names(lst) <- 1:length(lst) 

लेकिन मैं अपने जीवन के लिए डेटा फ्रेम में सूची कैसे प्राप्त कर सकता हूं, यह नहीं समझ सकता। मैं "वर्ग" होने की सूची प्राप्त कर सकते हैं (यानी ख़ाली जगह को भरने) और फिर उसे एक डेटा फ्रेम में डाल दिया:

lst <- xmlApply(xpeople, function(node) { 
    attrs = xmlAttrs(node) 
    if (!("height" %in% names(attrs))) { 
    attrs[["height"]] <- NA 
    } 
    attrs 
}) 
df = as.data.frame(lst) 

लेकिन मैं निम्नलिखित समस्या है:

  1. डेटा फ्रेम है स्थानांतरित
  2. पहली और आखिरी, कारक, नहीं chr
  3. ऊंचाई एक फैक्टर, नहीं सांख्यिक
  4. प्रथम और अंतिम नाम यूसुफ काले लिए चारों ओर बदली कर ली (नहीं एक बड़ा मुद्दा है के बाद से अपने डेटा सामान्य रूप से संगत है रहे हैं, लेकिन फिर भी परेशान)

मैं सही रूप में डेटा फ्रेम कैसे प्राप्त कर सकता हूं?

+0

'plyr :: rbind.fill (lapply (xmlToList (txt), फ़ंक्शन (x) as.data.frame (टी (एक्स), स्ट्रिंग्सएफ़ैक्टर्स = गलत))) शायद एक बहुत आसान है, हालांकि नहीं एक्सएमएल समाधान। फिर आप कारक ऊंचाई को 'as.numeric (' – user20650

+0

असल में http://stackoverflow.com/questions/2067098/how-to-transform-xml-data-into-a-data-frame?answertab=votes के साथ संख्यात्मक में परिवर्तित कर सकते हैं। # टैब-टॉप उपयोगी हो सकता है – user20650

+1

डेटा में गुण प्राप्त करने के लिए एक फ़ंक्शन है .frame 'XML ::: xmlAttrsToDataFrame (xml [" // person "])' –

उत्तर

3
txt <- '<people> 
      <person first="Mary" last="Jane" sex="F" /> 
      <person first="Susan" last="Smith" sex="F" height="168" /> 
      <person last="Black" first="Joseph" sex="M" /> 
      <person first="Jessica" last="Jones" sex="F" /> 
     </people>' 
library(XML)   # for xmlTreeParse 
library(data.table) # for rbindlist(...) 
xml <- xmlTreeParse(txt, asText=TRUE, useInternalNodes = TRUE) 
rbindlist(lapply(xml["//person"],function(x)as.list(xmlAttrs(x))),fill=TRUE) 
#  first last sex height 
# 1: Mary Jane F  NA 
# 2: Susan Smith F 168 
# 3: Joseph Black M  NA 
# 4: Jessica Jones F  NA 

आप के बजाय सिर्फ xmlAttrs(...) क्योंकि rbindlist(...) चाहता है प्रत्येक तर्क एक सूची, नहीं एक सदिश होने के लिए की as.list(xmlAttrs(...)) की जरूरत है।

संबंधित मुद्दे