这是我的数据集中XML格式的示例。
<info>
<a>1990-01-02T06:58:12+08:00</a>
<b>120.980</b>
<c>23.786</c>
<d>18.7</d>
<e>2</e>
</info>
<info>
<a>1990-02-02T06:58:12+08:00</a>
<b>120.804</b>
<c>23.790</c>
</info>
但是tag的数量与tag的数量不同,例如,标签a,b,c有4000行,而标签d,e只有3950行
这是我在R中的代码
library(xml2)
data.frame(Time = xml_text(xml_find_all(xml_data, ".//a")),
Num = xml_text(xml_find_all(xml_data, ".//b")),
Dist = xml_text(xml_find_all(xml_data, ".//c")),
Gap = xml_text(xml_find_all(xml_data, ".//d")),
Type = xml_text(xml_find_all(xml_data, ".//e")),
stringsAsFactors = F)
}) -> df
错误消息是:(我知道这会发生)
参数暗示行数不同
我想要的输出将类似于下表:
Time Num Dist Gap Type
1990-01-02T06:58:12+08:00 120.980 23.786 18.7 2
1990-02-02T06:58:12+08:00 120.804 23.790 <NA> <NA>
...
1993-03-03T08:42:15+08:00 120.412 23.523 <NA> 1
我应该尝试哪个函数或库?
感谢您的帮助!!
我尝试了另一种方法,例如map_if
答案 0 :(得分:0)
最后我找到了解决方案!
一旦我们使用xml文件,请确保首先获取记录的根节点。
在这里,我将向您展示其工作原理。
以这个xml文件为例:(将其命名为test.xml)
<dataset>
<dataset_info>
<data_count>2</data_count>
<status>Actual</status>
</dataset_info>
<data>
<time>2019-06-01</time>
<event>event1</event>
<describe>describe for event1</describe>
</data>
<data>
<time>2019-06-02</time>
<event>event2</event>
</data>
</dataset>
我们知道event2中缺少标签describe
,但我们希望以此xml数据构成数据框架。有人教我使用函数xml2::xml_find_all
来获取所选标签中的值。
通过这样的R代码:
# library import
library(xml) #require(xml2)
# file reading
xml <- read_xml("path/where/the/file/is/test.xml")
data.frame(Time = xml_text(xml_find_all(xml, ".//time"))
Event = xml_text(xml_find_all(xml, ".//event"))
Describe = xml_text(xml_find_all(xml, ".//describe"))
)
然后我们将收到错误消息arguments imply differing number of rows
所以我们要做的是首先获取记录的根源!! 如下面的代码:
# library import
library(xml) #require(xml2)
# file reading
xml <- read_xml("path/where/the/file/is/test.xml")
record <- xml_find_all(xml, ".//data")
data.frame(Time = xml_text(xml_find_all(record, ".//time"))
Event = xml_text(xml_find_all(record, ".//event"))
Describe = xml_text(xml_find_all(record, ".//describe"))
)
添加record <- xml_find_all(xml, ".//data")
后,我们将不再通过不同的结果计数来得到错误原因。
希望这会有所帮助!