我正在寻找一种简单有效的方法将XML数据转换为data.frame(但不是所有元素)。
我有这个文件:http://www-sop.inria.fr/members/Philippe.Poulard/projet/2013/entries_hotels.xml
我使用xpathSApply
,但这很糟糕,因为它不保存null元素。
在文件中,一些纬度是空的,但是xpathSApply
我无法知道哪些酒店有空纬度元素,因为它们会被忽略。
我找到了xmlToList
函数,它对XML很好,因为它的结构相同(它避免在数据框中有很多NULL值)。
但现在我有两个问题:
如果我想从这个列表中创建一个带有令人筋疲力尽的元素列表的数据框并保留NULLs元素,我该怎么办? 我做了这个,但是我的向量中没有保留NULL:
library(XML)
hotels <- "http://www-sop.inria.fr/members/Philippe.Poulard/projet/2013/entries_hotels.xml"
list <- xmlToList(hotels)
latitudes.hotels <- c()
for(element in list) {latitudes.hotels <- c(latitudes.hotels, element$latitude)}
我的第二个问题是,如果我想直接使用我的列表,问题是所有名称都是相同的:“条目”。
然后我想知道我如何能够访问Id等于x的条目,例如which(list$entry$ID == x)
我可以用与上面相同类型的矢量
ids.hotels <- c()
for(element in list) {ids.hotels <- c(ids.hotels, element$ID)}
list[[which(ids.hotels == x)]]
但我认为有更好的方法,如果我的XML文件中有一个ID元素为空,那就错了。
感谢您的帮助
答案 0 :(得分:1)
我不熟悉XML包,但您可以使用基本功能提取元素,并可以保留缺少的经度/纬度。
lst <- xmlToList(hotels)
ll <- lapply(1:150 , function(z)
c(id=lst[[z]][['ID']],name=lst[[z]][['name_fr']],
lat=lst[[z]][['latitude']],long=lst[[z]][['longitude']]))
library(plyr)
df <- rbind.fill(
lapply(ll,function(y){as.data.frame(t(y),stringsAsFactors=FALSE)}))
从这里获得rbind.fill:do.call(rbind, list) for uneven number of column
此外,虽然列表的所有名称都是'entry',例如使用名称(lst [1])作为第一个,您可以按名称获取名称(lst [[1]])