2015-07-19 53 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))