2017-09-18 7 views
0

Ich versuche eine XML-Datei in R zu importieren. Sie hat das folgende Format mit einem Ereignis in jeder Zeile, gefolgt von einer Anzahl von Attributen - welche sind abhängig vom Ereignistyp. Diese Datei ist 0.7GB und zukünftige Versionen können viel größer sein. Ich möchte einen Datenrahmen mit jedem Ereignis in einer neuen Zeile und allen möglichen Attributen in separaten Spalten erstellen (was bedeutet, dass einige je nach Ereignistyp leer sind). Ich habe anderswo nach Antworten gesucht, aber sie scheinen alle mit XML-Dateien in einer Baumstruktur zu arbeiten, und ich kann nicht herausfinden, wie man sie auf dieses Format anwendet.XML in R Datenrahmen importieren

Ich bin neu in R und habe keine Erfahrung mit XML-Dateien, also bitte geben Sie mir die "für Dummies" Antwort mit vielen Erklärungen. Vielen Dank!

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

Antwort

1

Sie können so etwas wie dies versuchen:

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) 

Wenn Sie weitere „numerisch“ Spalten haben, können Sie diese am Ende hinzufügen, um die Daten an die richtige Klasse zu konvertieren.