2015-07-19 56 views
0

长时间潜伏者,第一篇文章(很温和)。我试图从一个复杂的XML文件中制作一个“整齐”的R数据帧。部分成功,但由于我对R不熟悉,我无法想出一步。我认为这并不复杂,但我不能为了我的生活而克服它。 (曾做过多种谷歌搜索,计算器多看,尝试了很多东西,在4天内 - > #fail。)XML到R数据帧,重复标识符

  1. XML文件的摘录部分:

    library(XML) 
    mss <- xmlParse("BITECA.toy.XML") 
    xxx <- xmlToDataFrame(nodes = getNodeSet(mss, "//*/MsEd/MsEdID | //*/GeoMilestoneInfo/Dates"), collectNames=FALSE, stringsAsFactors = TRUE) 
    
  2. 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" 
    
  3. 我的问题是如何在NAS填充节点标识的重复,以获得我需要的整洁数据帧。 (需要进一步处理,但我想我知道如何做到这一点。)

    "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

EDITS
(一)以响应以下的要求,该文件在步骤1(BITECA.toy.XML)解析是这里https://www.dropbox.com/s/6fs0usac2l1m76m/BITECA.toy.xml?dl=0
(二)澄清 - 完整的XML文件有数千的“manid”项,而不仅仅是几个图所示

+0

给'动物园:: na.locf'看看 – hrbrmstr

回答

0

已经有发布了一些问题.....

How to transform XML data into a data.frame?

希望这应该能够帮助你转换XML到数据帧一世ssue。一旦你有了你的数据框,那么你可以使用is.na(dataframe)来测试和替换缺失值。

+0

THX的超快速的响应。我看过这篇文章,试图“强迫”它的想法对我的问题。经过漫长的斗争之后,我无法进入上面的第3步。 pfs – pfsullivan

+0

您可以发布xml文件的样本...它更容易调试,而不是猜测输出 – Sam

+0

完成 - 请参阅上面的 – pfsullivan

1

对于第三个步骤中,您可以使用na.locfzoo包:

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 

看来,前3列,你必须发扬过去的观察,而对于第四个,当你有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))