r - 如何将 xmlToDataframe 折叠成单行
问题描述
如何在不丢失子节点的情况下将 xml 转换为单行数据框。
这是我的代码减去查询,我尝试了不同的 foo 组合,但它们没有做我想要的。
xmltmp=xmlParse(xml)
xmlr=xmlRoot(xmltmp)
foo=xmlr[[1]]
xmldf=xmlToDataFrame(foo, stringsAsFactors = F)
> xmlr
<submission xmlns="http://opendatakit.org/submissions" xmlns:orx="http://openrosa.org/xforms">
<data>
<odk_chmin2 id="odk_chmin2" instanceID="uuid:748ffcc4-c4a2-4341-b613-fd3d0b7e83bd" version="20180531" submissionDate="2018-11-14T09:05:15.228-06:00" isComplete="true" markedAsCompleteDate="2018-11-14T09:05:15.228-06:00">
<colecta>
<cve_orig>IOR2015LI000559</cve_orig>
<fecha>2015-04-18</fecha>
<sitio>NTP2</sitio>
</colecta>
<geo_temp>
<temp>14.2700000000</temp>
<precip>9.5000000000</precip>
<veg>pino_encinoNTP</veg>
</geo_temp>
...
</odk_chmin2>
</data>
<mediaFile>
...
</mediaFile>
...
</submission>
cve_orig fecha sitio temp precip veg
1 IOR2015LI000559 2015-04-18 NTP2 14.2700000000 9.5000000000 pino_encinoNTP
我希望我的结果在单行中,但从我以前的结果来看: foo=xmlr[[1]] 执行单行但连接子节点
colecta geo_temp
1 IOR2015LI0005592015-04-18NTP2 14.27000000009.5000000000pino_encinoNTP
另一方面 foo=xmlr[[1]][[1]] 正确标记列但为每个节点添加一行,我怎样才能将它折叠成一行?
cve_orig fecha sitio temp precip veg
1 <NA> <NA> <NA> <NA> <NA> <NA>
2 IOR2015LI000559 2015-04-18 NTP2 <NA> <NA> <NA>
...
9 <NA> <NA> <NA> 14.2700000000 9.5000000000 pino_encinoNTP
解决方案
我从 xmlr 开始。即使你从你的 xml 开始也应该工作。这个想法是使用 xmlToList 来展平字段。
library(tidyverse)
library(XML)
my_tree = xmlTreeParse(xmlr)
my_root = xmlRoot(my_tree)
my_children = xmlChildren(my_root)
df = xmlToList(my_children$data) %>%
unlist %>%
data.frame(X1=.) %>%
rownames_to_column() %>%
spread(rowname, X1)
推荐阅读
- mysql - Mysql给了我不相关的结果
- jquery - 带有禁用子链接的跨度上的 JQuery UI 工具提示
- javascript - 使用 hls.js 修改 m3u8 文件
- java - 编译器如何知道 Lamba 正在实现哪个类?
- python - 在 jupyter 上删除 pandas 中数据帧的更快方法?
- python - 在python中使用x和y坐标排序字典
- ruby - 安装 pg 有问题
- javascript - jQuery 宽度输入字段错误
- postgresql - 在执行 postgres 查询之前从 salesforce 中的数字数据中删除逗号
- powershell - 哪个运算符为大型 CSV 文件提供更快的输出 -match -contains 或 Where-Object