【发布时间】:2019-10-03 16:45:01
【问题描述】:
我正在尝试将数据从 XML 转换为表格形式。我正在与子元素的元素作斗争。这是一个例子:
library(xml2)
library(data.table)
doc =
"<doc>
<rec>
<name> John </name>
<address>
<street> 2nd Av </street>
<number> 1036 </number>
</address>
<hobbies>
<hobby> tennis </hobby>
<hobby> gardening </hobby>
</hobbies>
</rec>
<rec>
<name> Mary </name>
<address>
<street>55th St</street>
<number> 132 </number>
</address>
<hobbies>
<hobby> running </hobby>
</hobbies>
</rec>
</doc>
"
# read in
pg <- read_xml(doc)
# make a list of records
recs = xml_find_all(pg, "//rec", xml_ns(pg))
# function to loop over list
extractRecord = function(x) {
txt = xml_text(xml_children(x))
name = xml_name(xml_children(x))
names(txt) = name
dt = setDT(as.list(txt))[]
return(dt)
}
# loop over list of records
lst = lapply(recs, extractRecord)
# bind elements do a data table
dt = rbindlist(lst, use.names = T, fill = T); dt
> name address hobbies
> 1: John 2nd Av 1036 tennis gardening
> 2: Mary 55th St 132 running
这就像一个魅力,除了我想拥有:
- 两列用于“地址”,每个子元素各一列,例如 address.street 和 address.number。
- 爱好的两列——比如说爱好 1 和爱好 2。需要注意的是,子子节点的数量是允许变化的。
最后,我会得到类似的东西
如果可能的话,我还想坚持使用xml2 包(因为我有很多大文件,而XML 包有已知的内存问题,这对我来说是个问题)。
【问题讨论】: