Seite 1 von 1

Zahlenvektor aus xml-Dokumenten

Verfasst: Do Nov 29, 2018 2:52 pm
von R_Forscher
Ich möchte Messwerte, die in xml-Dokumenten hinterlegt sind, zu einem Zahlenvektor zusammenfassen, um dann z.B. einen Mittelwert zu berechnen etc. Hier ein Beispiel XML-Dokument, welches ich doku.xml genannt habe:

Code: Alles auswählen

<meinDokumentInXML>
<Information>
<ErsteInformation> hier </ErsteInformation>
<ZweiteInformation> da </ZweiteInformation>
</Information>
<Messwerte>
<ErsterMesswert>10</ErsterMesswert>
<ZweiterMesswert>20</ZweiterMesswert>
</Messwerte>
</meinDokumentInXML>
Um das Dokument in R zu importieren und die Daten bearbeiten zu können, verwende ich folgende Packages:

Code: Alles auswählen

> install.packages("XML")
> library("XML")
> library("methods")
Ich importiere doku.xml mit:

Code: Alles auswählen

> xml_doku<-xmlParse(file="doku.xml")
Um die "root node form" des xml-Dokumentes in R nutzen zu können, mache ich Folgendes:

Code: Alles auswählen

> doku <- xmlRoot(xml_doku)
Nun kann ich mir den 1. Messwert anzeigen lassen mit:

Code: Alles auswählen

> doku[[2]][[1]][[1]]
10
Den 2. Messwert erhalte ich mit:

Code: Alles auswählen

> doku[[2]][[2]][[1]]
20
Dann dachte ich, könnte ich die Messwerte auch zu einem Messwerte-Vektor zusammenfassen. (Im wahren Leben stehen die Messwerte bei mir in vielen verschiedenen xml-Datein). Ich habe folgenden Befehl verwendet, was R ohne zu meckern ausführt:

Code: Alles auswählen

> vektor_Messwerte<-c(doku[[2]][[1]][[1]], doku[[2]][[2]][[1]])
Allerdings hat der Vektor dann folgende Struktur:

Code: Alles auswählen

> vektor_Messwerte
[[1]]
10 

[[2]]
20 
Und wenn ich den Mittelwert berechnen möchte, erscheint Folgendes:
> mean(vektor_Messwerte)
[1] NA
Warnmeldung:
In mean.default(vektor_Messwerte) :
Argument ist weder numerisch noch boolesch: gebe NA zurück
Ich hätte gern einen Vektor, der folgende Struktur hat:

Code: Alles auswählen

> vektor_Zahl<-c(10,20)
> vektor_Zahl
[1] 10 20
Wenn ich da z.B. den Mittelwert berechnen will, geht das folgerichtig mit

Code: Alles auswählen

> mean(vektor_Zahl)
[1] 15
Ehrlich gesagt verstehe ich nicht, warum R bei dem Befehl > c() eine andere Struktur im Vektor anlegt, wenn ich einen Pfad des Messwertes nenne. Wenn ich dagegen die Zahlen, die zum Vektor zusammengefasst werden sollen, direkt schreibe, erscheint ein normaler Zahlenvektor...

V.a. interessiert mich aber eine Lösung meines Problems...
Vielen Dank

Re: Zahlenvektor aus xml-Dokumenten

Verfasst: Fr Nov 30, 2018 12:34 pm
von bigben
R_Forscher hat geschrieben: Do Nov 29, 2018 2:52 pmAllerdings hat der Vektor dann folgende Struktur:

Code: Alles auswählen

> vektor_Messwerte
[[1]]
10 

[[2]]
20 
Das ist kein Vektor, das ist eine Liste. Die kann man mit unlist() in einen Vektor verwandeln

Code: Alles auswählen

> list(10,20)
[[1]]
[1] 10

[[2]]
[1] 20

> unlist(list(10,20))
[1] 10 20

> mean(unlist(list(10,20)))
[1] 15
LG,
Bernhard

Re: Zahlenvektor aus xml-Dokumenten

Verfasst: Sa Dez 01, 2018 12:17 am
von EDi
Taugt dir das was?

Code: Alles auswählen

xml <- '<meinDokumentInXML>
  <Information>
  <ErsteInformation> hier </ErsteInformation>
  <ZweiteInformation> da </ZweiteInformation>
  </Information>
  <Messwerte>
  <ErsterMesswert>10</ErsterMesswert>
  <ZweiterMesswert>20</ZweiterMesswert>
  </Messwerte>
  </meinDokumentInXML>'

library(xml2)
doc <- read_xml(xml)
xml_double(xml_find_all(doc, '//Messwerte/child::*'))
xpath ist eleganter als solche konstrukte: doku[[2]][[1]][[1]] Vorallem bei komplexeren xmls...