Zahlenvektor aus xml-Dokumenten

Wie erweitere ich R um eigene Funktionen oder Pakete? Welches Paket ist passend für meine Fragestellung?

Moderatoren: EDi, jogo

Antworten
R_Forscher

Zahlenvektor aus xml-Dokumenten

Beitrag 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
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Zahlenvektor aus xml-Dokumenten

Beitrag 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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Zahlenvektor aus xml-Dokumenten

Beitrag 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...
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
Antworten