长期潜伏者,第一篇文章(温柔)。我试图从复杂的XML文件中制作一个“整洁”的R数据帧。部分成功,但由于我对R的不熟悉,我无法弄清楚一步。我认为这并不复杂,但我不能为我的生活过去。 (已完成多次谷歌搜索,多次StackOverFlow外观,4天内尝试了很多事情 - > #fail。)
提取部分XML文件:
library(XML)
mss <- xmlParse("BITECA.toy.XML")
xxx <- xmlToDataFrame(nodes = getNodeSet(mss, "//*/MsEd/MsEdID | //*/GeoMilestoneInfo/Dates"), collectNames=FALSE, stringsAsFactors = TRUE)
对文本文件的write.table产生:
"Bibliography" "Type" "IDNo" "text"
"BITECA" "manid" "1086" NA
NA NA NA "1351 - 1400 (Bohigas i Riera)"
NA NA NA "1341 - 1360 (Lola Badia)"
NA NA NA "1401 - 1450 (Panunzio)"
"BITECA" "manid" "2744" NA
NA NA NA "1701 - 1800"
我的问题是如何用重复的节点标识符来填充NA,以获得我需要的更整洁的数据帧。 (需要进一步处理,但我想我知道该怎么做。)
"Bibliography" "IDNo" "text"
"BITECA" "1086" "1351 - 1400 (Bohigas i Riera)"
"BITECA" "1086" "1341 - 1360 (Lola Badia)"
"BITECA" "1086" "1401 - 1450 (Panunzio)"
"BITECA" "2744" "1701 - 1800"
我想知道这是否需要与R专家进行5分钟的对话?任何帮助将不胜感激!谢谢 - pfs
编辑
(a)为响应下面的请求,在步骤1中解析的文件(BITECA.toy.XML)在https://www.dropbox.com/s/6fs0usac2l1m76m/BITECA.toy.xml?dl=0
(b)澄清 - 完整的XML文件有数千个“manid”条目,而不仅仅是下面显示的几个
答案 0 :(得分:1)
对于第三步,您可以使用na.locf
包中的zoo
:
require(zoo)
unique(as.data.frame(
Map(na.locf,df,fromLast=rep(c(TRUE,FALSE),c(3,1)))
))
# Bibliography Type IDNo text
#1 BITECA manid 1086 1351 - 1400 (Bohigas i Riera)
#2 BITECA manid 2744 1341 - 1360 (Lola Badia)
#3 BITECA manid 2744 1401 - 1450 (Panunzio)
#5 BITECA manid 2744 1701 - 1800
似乎对于前三列你必须继续进行最后一次观察,而对于第四列,当你有NA
时,你必须先进行观察。这就是为什么我将fromLast
参数设置为TRUE
三次,第四次设置为FALSE
。
如果df
是您的data.frame
并且是此对象,则上述方法有效:
df <- structure(list(Bibliography = structure(c(1L, NA, NA, NA, 1L,
NA), .Label = "BITECA", class = "factor"), Type = structure(c(1L,
NA, NA, NA, 1L, NA), .Label = "manid", class = "factor"), IDNo = c(1086L,
NA, NA, NA, 2744L, NA), text = structure(c(NA, 2L, 1L, 3L, NA,
4L), .Label = c("1341 - 1360 (Lola Badia)", "1351 - 1400 (Bohigas i Riera)",
"1401 - 1450 (Panunzio)", "1701 - 1800"), class = "factor")), .Names = c("Bibliography",
"Type", "IDNo", "text"), class = "data.frame", row.names = c(NA,
-6L))
答案 1 :(得分:0)
已经发布了一些问题.....
How to transform XML data into a data.frame?
希望这应该能够帮助您将XML转换为数据框架问题。获得数据帧后,可以使用is.na(dataframe)来测试和替换缺失值。