【问题标题】:Load xml "rows" into R data table将 xml“行”加载到 R 数据表中
【发布时间】:2015-09-30 14:45:23
【问题描述】:

我有一些类似这样的数据:

<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>

我想要一个如下所示的数据框:

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

我已经走到这一步了:

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. first 和 last 是 Factors,而不是 chr
  3. 身高是一个因素,而不是数字
  4. 名字和姓氏被换成了 Joseph Black(这不是什么大问题,因为我的数据通常是一致的,但还是很烦人)

我怎样才能得到正确格式的数据框?

【问题讨论】:

  • plyr::rbind.fill(lapply(xmlToList(txt), function(x) as.data.frame(t(x), stringsAsFactors=FALSE))) 可能更容易一些,尽管不是 xml 解决方案。然后,您可以使用 as.numeric( 将因子高度转换为数字
  • 有一个函数可以将属性放入data.frame XML:::xmlAttrsToDataFrame(xml["//person"])

标签: xml r dataframe


【解决方案1】:
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

您需要as.list(xmlAttrs(...)) 而不仅仅是xmlAttrs(...),因为rbindlist(...) 希望每个参数都是一个列表,而不是一个向量。

【讨论】:

    猜你喜欢
    • 2012-09-09
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多