当值为多个或缺失时,来自XML的R数据帧
发布时间:2020-12-16 07:59:21 所属栏目:百科 来源:网络整理
导读:这个问题类似于上一个问题 Import all fields (and subfields) of XML as dataframe,但我想只提取XML数据的一个子集,并希望包含缺失/多个值. 我从一个XML文件开始,想要根据它包含的一些数据在R中构造一个数据帧,由XML元素的内容定义.用一个例子来解释是最容
这个问题类似于上一个问题
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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |