【问题标题】:XML Nodeset to R dataframeXML Nodeset 到 R 数据框
【发布时间】:2020-05-27 21:46:48
【问题描述】:

我有一个从 XML 文件中提取的节点集,如下所示:

   <section id="A00-A09">
      <desc>Intestinal infectious diseases (A00-A09)</desc>
      <diag>
        <name>A00</name>
        <desc>Cholera</desc>
        <diag>
          <name>A00.0</name>
          <desc>Cholera due to Vibrio cholerae 01, biovar cholerae</desc>
          <inclusionTerm>
            <note>Classical cholera</note>
          </inclusionTerm>
        </diag>
        <diag>
          <name>A00.1</name>
          <desc>Cholera due to Vibrio cholerae 01, biovar eltor</desc>
          <inclusionTerm>
            <note>Cholera eltor</note>
          </inclusionTerm>
        </diag>
        <diag>
          <name>A00.9</name>
          <desc>Cholera, unspecified</desc>
        </diag>
      </diag>

如何将其转换为 R 中的数据框,如下所示:

name      desc                  
A00       Cholera               
A00.0     biovar cholerae     
A00.1     biovar eltor          
A00.9     Cholera, unspecified   

我查看了几篇关于 R 中将 XML 转换为 df 的文章,但它们似乎都被指定为一个正在使用的 xml 文件(考虑到 xml,这很有意义),但我是从xml 并且无法在我的 xml_NodeSet 中找到适用于 44487 个元素的内容。仅供参考,我使用 xml2 来解析 xml 文件。

【问题讨论】:

  • 你试过在r中使用rvest包吗?您可以使用它来提取您需要的节点,然后使用 html_text(),然后根据需要操作生成的文本。
  • 我没有。让我阅读 rvest 的文档,看看我能不能得到我需要的东西。谢谢!
  • 基本上你会有一个 url 并将其传递给 read_html() 命令,然后搜索特定的节点(如名称、desc 和 note),然后删除 html 标签,所以用 tidyverse 说类似:read_html(URL) %&gt;% html_nodes("name") %&gt;% html_text(),这将为您提供代码中的所有名称。对 desc 和 note 执行相同操作,然后相互附加.. 虽然我不是 100% 确定如何处理这些丢失的注释...

标签: r xml dataframe xml2


【解决方案1】:

感谢@Nadia 的建议。我正在使用的 XML 文件没有 URL,所以我必须使用 xml_nodes()xml_text()

note 的缺失值确实给我带来了麻烦,幸运的是,在查看数据后,这不会像我之前预期的那样有价值。因此,我能够放弃它,这使得这个问题更加合理。

这是我所做的:

#after extracting the nodeset from my xml file
names <- xml_text(xml_nodes(diags, "name"))
desc <- xml_text(xml_nodes(diags, "desc"))

#convert to lists
names_list <- list(names)
desc_list <- list(desc)

#bring into a dataframe
df <- do.call(rbind, Map(data.frame, A=names_list, B=desc_list))

head(df)
  icdcode                                               name
1     A00                                            Cholera
2   A00.0 Cholera due to Vibrio cholerae 01, biovar cholerae
3   A00.1    Cholera due to Vibrio cholerae 01, biovar eltor
4   A00.9                               Cholera, unspecified
5     A01                     Typhoid and paratyphoid fevers
6   A01.0                                      Typhoid fever

【讨论】:

    猜你喜欢
    • 2017-06-22
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多