dynamische datenfiles einlese

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

dynamische datenfiles einlese

Beitrag 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
jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

Re: dynamische datenfiles einlese

Beitrag 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
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: dynamische datenfiles einlese

Beitrag 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)) 
jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

Re: dynamische datenfiles einlese

Beitrag 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
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: dynamische datenfiles einlese

Beitrag 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")
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: dynamische datenfiles einlese

Beitrag von EDi »

oder anstatt setwd() , den vollen Pfad von list.files() ausgeben lassen...
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.
jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

Re: dynamische datenfiles einlese

Beitrag von jessi »

Hallo.

Danke, so funktioniert es :)

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

Grüße,
Jessi
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: dynamische datenfiles einlese

Beitrag von EDi »

Siehe ?list.files , das Argument heißt "full.names".
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.
jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

Re: dynamische datenfiles einlese

Beitrag von jessi »

Hallo.

Vielen Dank euch beiden :)

Grüße,
Jessi
Antworten