2017-09-18 101 views
0

我正在嘗試將一個xml文件導入到R中。它的格式如下,每行上有一個事件,後面跟着一些屬性 - 哪些取決於事件類型。這個文件是0.7GB,未來的版本可能會更大。我想創建一個數據框,每個事件都在一個新行上,並且所有可能的屬性都在不同的列中(意思是根據事件類型不同而不同)。我在其他地方尋找答案,但他們似乎都在處理樹形結構中的XML文件,我無法弄清楚如何將它們應用於這種格式。將XML導入R數據框

我是R新手,對XML文件沒有經驗,所以請給我一些「傻瓜」的答案,並附上大量的解釋。謝謝!

<?xml version="1.0" encoding="utf-8"?> 
<events version="1.0"> 
    <event time="21510.0" type="actend" person="3" link="1" actType="h" /> 
    <event time="21510.0" type="departure" person="3" link="1" legMode="car" /> 
    <event time="21510.0" type="PersonEntersVehicle" person="3" vehicle="3" /> 
    <event time="21510.0" type="vehicle enters traffic" person="3" link="1" vehicle="3" networkMode="car" relativePosition="1.0" /> 

... 

</events> 

回答

1

你可以嘗試這樣的事情:

original_xml <- '<?xml version="1.0" encoding="utf-8"?> 
    <events version="1.0"> 
     <event time="21510.0" type="actend" person="3" link="1" actType="h" /> 
      <event time="21510.0" type="departure" person="3" link="1" legMode="car" /> 
       <event time="21510.0" type="PersonEntersVehicle" person="3" vehicle="3" /> 
        <event time="21510.0" type="vehicle enters traffic" person="3" link="1" vehicle="3" networkMode="car" relativePosition="1.0" /> 
        </events>' 
library(xml2) 

data2 <- xml_children(read_xml(original_xml)) 
attr_names <- unique(names(unlist(xml_attrs(data2)))) 

xmlDataFrame <- as.data.frame(sapply(attr_names, function (attr) { 
    xml_attr(data2, attr = attr) 
}), stringsAsFactors = FALSE) 

#-- since all columns are strings, you may want to turn the numeric columns to numeric 

xmlDataFrame[, c("time", "person", "link", "vehicle")] <- sapply(xmlDataFrame[, c("time", "person", "link", "vehicle")], as.numeric) 

如果你有額外的「數字」列,可以在最後將它們添加到數據轉換到正確的類。