2015-09-30 10 views
5

私はこのような形をいくつかのデータがあります:私はこれを得ている負荷のxml「行」Rデータテーブルに

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. を転置要因である、
  3. 高さをCHRない私のデータが正常に一貫性があることから、姓と名はジョゼフ・ブラックの周りを入れ替えてしまった要因ではなく、数値
  4. (ない大きな問題ですが、それにもかかわらず)

正しい形式でデータフレームを取得するにはどうすればよいですか?

+0

'plyr :: rbind.fill(lapply(xmlToList(txt)、function(x)as.data.frame(t(x)、stringsAsFactors = FALSE)))'おそらく、 xmlソリューションです。次に、因子の高さを 'as.numeric(' – user20650

+0

実際にはhttp://stackoverflow.com/questions/2067098/how-to-transform-xml-data-into-a-data-frame?answertab=votes #tab-topは便利かもしれません – user20650

+1

属性をdata.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 

rbindlist(...)は、各引数がリストではなく、ベクトルになりたいので、あなたはas.list(xmlAttrs(...))だけではなくxmlAttrs(...)を必要としています。