Seite 1 von 1

dynamische datenfiles einlese

Verfasst: Mi Okt 25, 2017 7:14 am
von jessi
Hallo zusammen,

ich habe mehrere xml.Files mit Messdaten. Diese sind jetzt Tageweise abgespeichert mit 19990101.xml, 19990102.xml ... 19991231.xml.

Derzeit lese ich die Files (jeweils eines) folgendermaßen ein:

Code: Alles auswählen

install.packages("XML")
library("XML")

data <- xmlToDataFrame("19990101.xml")
str(data)
$ time: chr "19990101-00" "19990101-01" ...
$ station: chr "001" "002" "003" ...
$ temperature: chr "14" "12.3" "17.1" ...
$ wind: chr "1.4" "2.0" ...
$ niederschlag: chr "0.0" "0.0" "0.1" ...
$ art: chr "0" "0" "0" "1" ...
Um nicht jedes File separat einlesen zu müssen, habe ich folgendes probiert:

Code: Alles auswählen

Files <- sprintf("199901%i.xml",1:5)
Files 
19990101.xml
19990102.xml
19990103.xml
19990104.xml
19990105.xml

data_zz <- data.frame(name=character(0), len=numeric(0))
for (i in 1:5) {data_zz <- rbind(data_zz, data.frame(xmlToDataFrame(Files[i]),nchar(i))) }

str(data_zz)
$ time: chr "19990101-00" "19990101-01" ...
$ station: chr "001" "002" "003" ...
$ temperature: chr "14" "12.3" "17.1" ...
$ wind: chr "1.4" "2.0" ...
$ niederschlag: chr "0.0" "0.0" "0.1" ...
$ art: chr "0" "0" "0" "1" ...

min(data_zz$time)
"19990101-00"
max(data_zz$time)
"19990105-23"


Jetzt ist mir nur aufgefallen, dass die doppelte Anzahl von Werten abgespeichert ist, wenn ich weiter filtere mit

Code: Alles auswählen

s001 <- subset(data_zz, data_zz$station == "001")
dann kommt beispielsweise "19990101-13" zweimal vor - also eigentlich kommt jeder Wert zweimal vor? Ich komme nur nicht drauf, wo der Fehler liegt :?:
In Summe hinkt der Code aber noch als ganzes. So wie ich jetzt die Filenamen (sprintf) einlese, funktioniert das ja nur bis zur ersten 10er Stelle, danach bräuchte ich eine weitere Zeile die die 1 (für die zehner) und später auch die 2 bzw. 3 (21-29, 30-31) berücksichtigt. Kann ich die Daten auch so einlesen, dass es keine chr sind? Wenn möglich, möchte ich auch ganz auf die for-Schleife verzichten, da der Code dadurch sehr träge wird.

Würde mich freuen, wenn mir von euch jemand weiterhelfen könnte.
Danke für eure Hilfe!
glg. Jessi

Re: dynamische datenfiles einlese

Verfasst: Mi Okt 25, 2017 8:01 am
von jessi
Hallo,

ich noch mal :)

Einen Teil konnte ich bereits lösen:
wenn ich die Files so einlese, fällt das 10,20 und 30 Problem bereits weg bzw. wenn ich die Schleife etwas umbaue auch das Duplizieren der Daten.

Code: Alles auswählen

Ordner <- "C:\Users\jessi\Desktop"
files <- list.files(Ordner, pattern="*.xml")

data = NULL
for (i in 1:length(files)) { df <- xmlToDataFrame(files[i])
					data = rbind(data, df) }
Leider ist der Code wegen der for-Schleife (nehm ich jetzt mal in meiner Unwissenheit an) noch immer sehr langsam.

Danke nochmals und glg
Jessi

Re: dynamische datenfiles einlese

Verfasst: Mi Okt 25, 2017 8:30 am
von jogo
Hallo Jessi
jessi hat geschrieben: Mi Okt 25, 2017 8:01 am Einen Teil konnte ich bereits lösen:
wenn ich die Files so einlese, fällt das 10,20 und 30 Problem bereits weg bzw. wenn ich die Schleife etwas umbaue auch das Duplizieren der Daten.
prima.

Code: Alles auswählen

Ordner <- "C:\Users\jessi\Desktop"
files <- list.files(Ordner, pattern="*.xml")

data = NULL
for (i in 1:length(files)) { df <- xmlToDataFrame(files[i])
					data = rbind(data, df) }
Leider ist der Code wegen der for-Schleife (nehm ich jetzt mal in meiner Unwissenheit an) noch immer sehr langsam.
Meiner Meinung nach ist der Hauptaufwand in xmlToDataFrame() (so eine XML-Datei will auch erstmal interpretiert sein), aber Du kannst ja gerne als Alternative ausprobieren:

Code: Alles auswählen

Ordner <- "C:\Users\jessi\Desktop"
files <- list.files(Ordner, pattern="*.xml")

dfList <- lapply(files, xmlToDataFrame)
data <- do.call(rbind, dfList) 
Gruß, Jörg
p.s.: Als Einzeiler

Code: Alles auswählen

data <- do.call(rbind, lapply(list.files(Ordner, pattern="*.xml"), xmlToDataFrame)) 

Re: dynamische datenfiles einlese

Verfasst: Mi Okt 25, 2017 1:41 pm
von jessi
Hallo Jörg,

vielen Dank für deine Antwort. Ich hab deine Zeile jetzt in mein Programm eingebaut.

Leider ergibt sich jetzt ein neues Problem. Bis jetzt lagen die Daten unter dem Pfad "C:\Users\jessi\Desktop". Um etwas Ordnung zu bekommen, habe ich Unterordner angelegt mit dem Pfad: "C:\Users\jessi\Desktop\Daten\01" und ich lese wie vorhin die Daten ein:

Code: Alles auswählen

Ordner <- "C:\\Users\\jessi\\Desktop\\Daten\\01"
files <- list.files(Ordner, pattern="*.xml")
Laut prind(files) müssten alle Files aus dem Ordner ausgelesen werden. Allerdings wird mir in der nächsten Zeile dann ein Fehler ausgeben.

Code: Alles auswählen

dfList <- lapply(files, xmlToDataFrame)

Fehler: XML content does not seem to be XML: '19990101.xml'
Wenn ich als Pfad weiterhin bei "C:\Users\jessi\Desktop" bleibe und die gleichen Files mit der gleichen Commandozeile einlese funktioniert es einwandfrei. Kann ich hier nicht auf die Unterordner zugreifen? Benötige ich dazu einen bestimmten Befehl?

Danke nochmals,
Jessi

Re: dynamische datenfiles einlese

Verfasst: Mi Okt 25, 2017 1:54 pm
von jogo

Code: Alles auswählen

Ordner <- "C:\\Users\\jessi\\Desktop\\Daten\\01"
files <- list.files(Ordner, pattern="*.xml")
setwd(Ordner)
oder

Code: Alles auswählen

Ordner <- "C:\\Users\\jessi\\Desktop\\Daten\\01"
setwd(Ordner)
files <- list.files(pattern="*.xml")
Für weitere Informationen ist ein Blick in den Hilfetext zu der Funktion empfehlenswert.

Code: Alles auswählen

help("list.files")

Re: dynamische datenfiles einlese

Verfasst: Do Okt 26, 2017 8:07 am
von EDi
oder anstatt setwd() , den vollen Pfad von list.files() ausgeben lassen...

Re: dynamische datenfiles einlese

Verfasst: Do Okt 26, 2017 1:55 pm
von jessi
Hallo.

Danke, so funktioniert es :)

EDI, wie kann ich mir den vollen Pfad ausgeben lassen?

Grüße,
Jessi

Re: dynamische datenfiles einlese

Verfasst: Do Okt 26, 2017 11:07 pm
von EDi
Siehe ?list.files , das Argument heißt "full.names".

Re: dynamische datenfiles einlese

Verfasst: Sa Okt 28, 2017 11:47 am
von jessi
Hallo.

Vielen Dank euch beiden :)

Grüße,
Jessi