【问题标题】:XML to R data frame, repeating identifiersXML 到 R 数据框,重复标识符
【发布时间】:2015-07-19 14:03:42
【问题描述】:

长期潜伏者,第一次发帖(温柔点)。我试图从一个复杂的 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"
    

我想知道这是否是需要与 R 专家进行 5 分钟对话的事情之一?任何帮助将不胜感激!谢谢-pfs

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

【问题讨论】:

  • zoo::na.locf看看

标签: xml r


【解决方案1】:

第三步,你可以使用zoo包中的na.locf

 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))

【讨论】:

    【解决方案2】:

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

    How to transform XML data into a data.frame?

    希望这应该能够帮助您将 XML 转换为数据框问题。拥有数据框后,您可以使用 is.na(dataframe) 来测试和替换缺失值。

    【讨论】:

    • 感谢超快速响应。我看过这篇文章,试图将其中的想法“强制”到我的问题上。经过长时间的挣扎,我无法将其带到上面的第 3 步。 pfs
    • 你能发布一个xml文件的样本吗...它变得更容易调试而不是猜测输出
    猜你喜欢
    • 2019-06-08
    • 1970-01-01
    • 2017-06-22
    • 2020-06-24
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    相关资源
    最近更新 更多