XML到R数据帧,重复标识符

时间:2015-07-19 14:03:43

标签: xml r

长期潜伏者,第一篇文章(温柔)。我试图从复杂的XML文件中制作一个“整洁”的R数据帧。部分成功,但由于我对R的不熟悉,我无法弄清楚一步。我认为这并不复杂,但我不能为我的生活过去。 (已完成多次谷歌搜索,多次StackOverFlow外观,4天内尝试了很多事情 - > #fail。)

  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. 我的问题是如何用重复的节点标识符来填充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"
    
  4. 我想知道这是否需要与R专家进行5分钟的对话?任何帮助将不胜感激!谢谢 - pfs

    编辑
    (a)为响应下面的请求,在步骤1中解析的文件(BITECA.toy.XML)在https://www.dropbox.com/s/6fs0usac2l1m76m/BITECA.toy.xml?dl=0 (b)澄清 - 完整的XML文件有数千个“manid”条目,而不仅仅是下面显示的几个

2 个答案:

答案 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)来测试和替换缺失值。