微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当值为多个或缺失时,来自XML的R数据帧

这个问题类似于上一个问题 Import all fields (and subfields) of XML as dataframe,但我想只提取XML数据的一个子集,并希望包含缺失/多个值.

我从一个XML文件开始,想要根据它包含的一些数据在R中构造一个数据帧,由XML元素的内容定义.用一个例子来解释是最容易的.在下面,我想要找出每个城市的地标信息(即使没有地标元素或有几个),并忽略有关电台的信息.

<world>
    <city>
        <name>London</name>
        <buildings>
            <building>
                <type>landmark</type>
                <bname>Tower Bridge</bname>
            </building>
            <building>
                <type>station</type>
                <bname>Waterloo</bname>
            </building>
        </buildings>
    </city>
    <city>
        <name>New York</name>
        <buildings>
            <building>
                <type>station</type>
                <bname>Grand Central</bname>
            </building>
        </buildings>
    </city>
    <city>
        <name>Paris</name>
        <buildings>
            <building>
                <type>landmark</type>
                <bname>eiffel Tower</bname>
            </building>
            <building>
                <type>landmark</type>
                <bname>Louvre</bname>
            </building>
        </buildings>
    </city>
</world>

理想情况下,这将进入如下所示的数据框:

London      Tower Bridge
 New York    NA
 Paris       eiffel Tower
 Paris       Louvre

我假设可能有一种方法可以使用XML库和xpathSApply来做到这一点,但我想我已经被打败了.

也无法想象如何在不参考示例的情况下对问题进行短语,因此请随意编辑以提供更具描述性的问题.

假设XML数据位于名为world.xml的文件中,请将其读入并遍历城市,提取城市名称和任何相关地标的bname:
library(XML)
doc <- xmlParse("world.xml",useInternalNodes = TRUE)

do.call(rbind,xpathApply(doc,"/world/city",function(node) {

   city <- xmlValue(node[["name"]])

   xp <- "./buildings/building[./type/text()='landmark']/bname"
   landmark <- xpathSApply(node,xp,xmlValue)
   if (is.null(landmark)) landmark <- NA

   data.frame(city,landmark,stringsAsFactors = FALSE)

}))

结果是:

city     landmark
1   London Tower Bridge
2 New York         <NA>
3    Paris eiffel Tower
4    Paris       Louvre

原文地址:https://www.jb51.cc/xml/293134.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。