2016-11-22 5 views
0

Ich habe eine Reihe von Chat-Transkripten im XML-Format. Ich habe unten einen Beispieldatensatz eingefügt. Ich brauche nicht die ganze Platte, nur 3 Dinge. Das erste ist das Attribut @realTimeID. Die zweiten/dritten Elemente sind die Werte von varValue, wenn Quelle == "PostChat". Dies beinhaltet einen numerischen Wert von 1-10. Es kann einen zweiten Wert geben, der einen Texteintrag enthält. Nur eine kleine Anzahl von Datensätzen enthält diese "PostChat" -Werte.R XML zu DataFrame-Teilmenge

Was ich will ist ein Datenrahmen mit einer Spalte für RealTimeID und dann 2 Spalten für die numerischen und möglichen Textwert. Wenn ich einen Datenrahmen mit einer Spalte für RealTimeID und eine zweite Spalte für Wert erhalten könnte, könnte ich mit den Daten von dort gut arbeiten.

Hier einige Beispieldaten:

<Report account="12345" end_time="2016-07-01T00:00:59+00:00" limit="10000" more_sessions="true" start_time="2016-06-11T00:00:00+00:00" user="smith"> 
    <Session id="ID1536678170" realTimeID="4768543970"> 
     <Visitor id="1131902386012684"> 
     <ip>123.456.789</ip> 
     <agent>Chrome 51.0.2704.63</agent> 
     <host/> 
     <chatReferer> foo </chatReferer> 
     <GeoInfo> 
      <geoCity/> 
      <geoConType/> 
      <geoCountry>USA</geoCountry> 
      <geoIP>123.456.789</geoIP> 
      <geoISP>USA ISP</geoISP> 
      <geoOrg>NA</geoOrg> 
      <geoPost/> 
      <geoReg/> 
     </GeoInfo> 
     </Visitor> 
     <Chat end_time="2016-06-11T21:46:14+00:00" start_time="2016-06-11T21:25:59+00:00"> 
     <line by="info" time="2016-06-11T21:25:59+00:00"> 
      <Text>Please do not post credit card or other sensitive data in this window. </Text> 
     </line> 
     <line by="info" time="2016-06-11T21:26:03+00:00"> 
      <Text>You are now chatting with John.</Text> 
     </line> 
     <line by="John" repId="ID2447" time="2016-06-11T21:28:04+00:00"> 
      <HTML>&lt;span dir="ltr"&gt;Hi sir&lt;/span&gt;</HTML> 
     </line> 
     <line by="John" repId="ID2447" time="2016-06-11T21:28:15+00:00"> 
      <HTML>&lt;span dir="ltr"&gt;How may i help you ?&lt;/span&gt;</HTML> 
     </line> 
     <line by="you" time="2016-06-11T21:28:16+00:00"> 
      <Text>Hi John. Im Bob. I have a technical question.</Text>  
     </line> 
     </Chat> 
     <VarValues> 
     <varValue id="ID917165" name="DisconnectedBy" source="Internal" sourceName="null" time="2016-06-11T21:46:14+00:00">RepStoppedChat</varValue> 
     <varValue id="ID922205" name="language" source="MonitorTag" sourceName="null" time="2016-06-11T21:23:46+00:00">English</varValue> 
     <varValue id="ID1317606" name="pageLoadTime" source="MonitorTag" sourceName="null" time="2016-06-11T21:23:46+00:00">88 sec</varValue> 
     <varValue id="ID1323660" name="survey90990357" source="Operator" sourceName="null" time="2016-06-11T21:32:38+00:00">Incomplete (INC) - customer abandons</varValue> 
     <varValue id="ID1372749" name="LP_Visitor_Category" source="Internal" sourceName="null" time="2016-06-11T21:23:43+00:00">0</varValue> 
     <varValue id="ID1617100" name="live_engage_control_group" source="Internal" sourceName="null" time="2016-06-11T21:23:43+00:00">false</varValue> 
     <varValue id="ID3647561" name="rerouteFlag" source="Rule Engine" sourceName="null" time="2016-06-11T21:23:46+00:00">true</varValue> 
     <varValue id="ID3665417" name="operatorName" source="Rule Engine" sourceName="null" time="2016-06-11T21:26:03+00:00">John Doe</varValue> 
     <varValue id="ID3730453" name="RenameFlag" source="Rule Engine" sourceName="null" time="2016-06-11T21:23:46+00:00">true</varValue> 
     <varValue id="ID3742796" name="PT-EligibleInSession" source="Rule Engine" sourceName="null" time="2016-06-11T21:24:43+00:00">Yes</varValue> 
     <varValue id="ID3834774" name="survey88140234" source="PostChat" sourceName="null" time="2016-06-13T04:44:54+00:00">10</varValue> 
     <varValue id="ID3834774" name="survey88140234" source="PostChat" sourceName="null" time="2016-06-13T04:44:54+00:00">Great Experience. Thanks for the help!</varValue> 
     </VarValues> 
     <Reps> 
     <Rep endTime="2016-06-11T21:46:14+00:00" id="ID2447" order="1" repName="John Doe" startTime="2016-06-11T21:26:03+00:00">John</Rep> 
     </Reps> 
    </Session> 
     <Session id="ID1536678170" realTimeID="123456789"> 
     <Visitor id="1131902386012684"> 
     <ip>123.456.789</ip> 
     <agent>Chrome 51.0.2704.63</agent> 
     <host/> 
     <chatReferer> foo </chatReferer> 
     <GeoInfo> 
      <geoCity/> 
      <geoConType/> 
      <geoCountry>USA</geoCountry> 
      <geoIP>123.456.789</geoIP> 
      <geoISP>USA ISP</geoISP> 
      <geoOrg>NA</geoOrg> 
      <geoPost/> 
      <geoReg/> 
     </GeoInfo> 
     </Visitor> 
     <Chat end_time="2016-06-11T21:46:14+00:00" start_time="2016-06-11T21:25:59+00:00"> 
     <line by="info" time="2016-06-11T21:25:59+00:00"> 
      <Text>Please do not post credit card or other sensitive data in this window. </Text> 
     </line> 
     <line by="info" time="2016-06-11T21:26:03+00:00"> 
      <Text>You are now chatting with John.</Text> 
     </line> 
     <line by="John" repId="ID2447" time="2016-06-11T21:28:04+00:00"> 
      <HTML>&lt;span dir="ltr"&gt;Hi sir&lt;/span&gt;</HTML> 
     </line> 
     <line by="John" repId="ID2447" time="2016-06-11T21:28:15+00:00"> 
      <HTML>&lt;span dir="ltr"&gt;How may i help you ?&lt;/span&gt;</HTML> 
     </line> 
     <line by="you" time="2016-06-11T21:28:16+00:00"> 
      <Text>Hi John. Im Bob. I have a technical question.</Text>  
     </line> 
     </Chat> 
     <VarValues> 
     <varValue id="ID917165" name="DisconnectedBy" source="Internal" sourceName="null" time="2016-06-11T21:46:14+00:00">RepStoppedChat</varValue> 
     <varValue id="ID922205" name="language" source="MonitorTag" sourceName="null" time="2016-06-11T21:23:46+00:00">English</varValue> 
     <varValue id="ID1317606" name="pageLoadTime" source="MonitorTag" sourceName="null" time="2016-06-11T21:23:46+00:00">88 sec</varValue> 
     <varValue id="ID1323660" name="survey90990357" source="Operator" sourceName="null" time="2016-06-11T21:32:38+00:00">Incomplete (INC) - customer abandons</varValue> 
     <varValue id="ID1372749" name="LP_Visitor_Category" source="Internal" sourceName="null" time="2016-06-11T21:23:43+00:00">0</varValue> 
     <varValue id="ID1617100" name="live_engage_control_group" source="Internal" sourceName="null" time="2016-06-11T21:23:43+00:00">false</varValue> 
     <varValue id="ID3647561" name="rerouteFlag" source="Rule Engine" sourceName="null" time="2016-06-11T21:23:46+00:00">true</varValue> 
     <varValue id="ID3665417" name="operatorName" source="Rule Engine" sourceName="null" time="2016-06-11T21:26:03+00:00">John Doe</varValue> 
     <varValue id="ID3730453" name="RenameFlag" source="Rule Engine" sourceName="null" time="2016-06-11T21:23:46+00:00">true</varValue> 
     <varValue id="ID3742796" name="PT-EligibleInSession" source="Rule Engine" sourceName="null" time="2016-06-11T21:24:43+00:00">Yes</varValue> 
     </VarValues> 
     <Reps> 
     <Rep endTime="2016-06-11T21:46:14+00:00" id="ID2447" order="1" repName="John Doe" startTime="2016-06-11T21:26:03+00:00">John</Rep> 
     </Reps> 
    </Session> 
</Report> 

ich in den Daten lesen kann:

library(XML) 

dat <- xmlInternalTreeParse("data/sessions6.xml", useInternalNodes = T) 

ich mit dem realTimeID Wert extrahieren:

foo <- xpathApply(datRoot, "//Session", xmlGetAttr, "realTimeID") 

und die VarValues ​​ich brauche Verwenden:

tmp <- xpathApply(datRoot, "//varValue[@source='PostChat']", xmlValue) 

Aber ich weiß nicht, wie Sie die beiden verbinden und die RealTimeID-Werte, die den PostChat-Variablen zugeordnet sind, greifen. Alternativ habe ich darüber nachgedacht, einen Datenrahmen mit realTimeID und allen VarValues ​​zu erstellen. Ich habe natürlich die Liste aller IDs, war mir aber nicht sicher, wie ich einfach einen Datenrahmen von VarValues ​​extrahieren könnte. Jede Hilfe wäre willkommen.

EDIT: Ich habe meine XML-Code-Beispiel aktualisiert, um es vollständiger zu machen und eine Sitzung mit PostChat-Werten und eine ohne. Vielen Dank!

+0

Wird jeder XML nur tragen ein oder zwei 'varValues' mit' @ postChat'? Für eine Zeile df von 3 vars? – Parfait

+0

Jeder "record" sollte nicht mehr als 2 "PostChat" varValues ​​haben. Die meisten Datensätze enthalten jedoch keine PostChat-Variablen. Ich habe das XML für einen einzelnen "Record" gepostet. Jede meiner XML-Dateien hat tatsächlich 10k Einträge. –

Antwort

2

Für die aktualisierte XML-Datei, die Sie diese Möglichkeiten:

require(xml2) 
require(tidyverse) 
doc <- read_xml(path_to_file) 
sessions <- doc %>% xml_find_all("Session") 
realTimeID <- sessions %>% map(xml_attr, "realTimeID") 
varValue <- sessions %>% 
    map(xml_find_all, ".//varValue[@source='PostChat']") %>% 
    map(xml_text) 
map2_df(realTimeID, varValue, ~tibble(realTimeID = .x, value = .y[1], text = .y[2])) 

Welche gibt Ihnen:

# A tibble: 2 × 3 
    realTimeID value         text 
     <chr> <chr>         <chr> 
1 4768543970 10 Great Experience. Thanks for the help! 
2 123456789 <NA>         <NA> 

Sie type_convert verwenden können, um die Spalte zu ändern getippt

+0

Danke für die Eingabe. Ich denke, dass dieser Ansatz nicht funktioniert, wenn einige RealTimeID Werte keinen PostChat VarValue haben. Ich habe mein XML-Beispiel oben aktualisiert, um es vollständiger zu machen und einen zweiten Sitzungsdatensatz aufzunehmen, der keine PostChat-Werte enthält. –

+0

Aweseme! Vielen Dank. Das hat perfekt funktioniert. –