【发布时间】: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)
但是我有以下问题:
- 数据帧被转置
- first 和 last 是 Factors,而不是 chr
- 身高是一个因素,而不是数字
- 名字和姓氏被换成了 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"])