如何使用不同行数但相关的“ data.frame”(不是“ by”)

时间:2019-06-08 03:37:46

标签: r dataframe

这是我的数据集中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

1 个答案:

答案 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")后,我们将不再通过不同的结果计数来得到错误原因。

希望这会有所帮助!