gpt4 book ai didi

xml - 将xml "rows"加载到R数据表中

转载 作者:数据小太阳 更新时间:2023-10-29 01:57:56 26 4
gpt4 key购买 nike

我有一些这样的数据:

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

如何获得正确形式的数据框?

最佳答案

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(...) 希望每个参数都是一个列表,而不是一个向量。

关于xml - 将xml "rows"加载到R数据表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32869100/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com