Schleife für viele Dateien

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

Moderatoren: EDi, jogo

Antworten
Student_L
Beiträge: 8
Registriert: Di Mai 19, 2020 1:34 pm

Schleife für viele Dateien

Beitrag von Student_L »

Hallo,

ich bin ein kompletter R Neuling und deshalb etwas ratlos, wie ich mit Schleifen arbeite.
Folgende Situation:
Ich mache eine Zeitreihen Analyse. Die Analyse mit einer Datei funktioniert soweit.
Nun möchte ich das selbe Spiel für die restlichen fast 200 Dateien (alle csv) durchführen.
Wie kann ich alle Dateien einladen und eine Schleife einbauen?
Außerdem hatte ich mir vorgestellt, dass sich die Benennung der Graphen der jeweiligen Datei anpasst. Ist das zu realisieren?

Vielen Dank im Voraus
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Schleife für viele Dateien

Beitrag von jogo »

Hallo Student_L,

willkommen im Forum!
Student_L hat geschrieben: Di Mai 19, 2020 1:53 pm ich bin ein kompletter R Neuling und deshalb etwas ratlos, wie ich mit Schleifen arbeite.
Folgende Situation:
Ich mache eine Zeitreihen Analyse. Die Analyse mit einer Datei funktioniert soweit.
Kannst Du uns grob zeigen, wie das momentan aussieht?
Diesen Teil müsstest Du in eine Funktion packen, die als Argument einen Dateinamen aufnimmt:

Code: Alles auswählen

myAnalyse <- function(Datei) {
  ...
}
Nun möchte ich das selbe Spiel für die restlichen fast 200 Dateien (alle csv) durchführen.
Wie kann ich alle Dateien einladen und eine Schleife einbauen?

Code: Alles auswählen

# ... Arbeitsverzeichnis setzten
Dateien <- dir(pattern="*.csv")
Den Rest macht dann lapply():

Code: Alles auswählen

lapply(Dateien, FUN=myAnalyse)
Außerdem hatte ich mir vorgestellt, dass sich die Benennung der Graphen der jeweiligen Datei anpasst. Ist das zu realisieren?
ja

Gruß, Jörg
Student_L
Beiträge: 8
Registriert: Di Mai 19, 2020 1:34 pm

Re: Schleife für viele Dateien

Beitrag von Student_L »

Vielen Dank,
das hat mir schon weiter geholfen. :D
Student_L
Beiträge: 8
Registriert: Di Mai 19, 2020 1:34 pm

Re: Schleife für viele Dateien

Beitrag von Student_L »

Scheinbar habe ich das mit der Schleife doch nicht verstanden. :oops:
Hier eine gekürzte Variante meines Codes.

Code: Alles auswählen

daten<-read.csv("C:/Users/Documents/Master/Projekt/data/AB_113.csv")
# Kürzen der Daten (ab 22.01.2007)
dat<-subset(daten,Date>="2007-01-22")
# umwandeln in Vektor
ze=dat$Date
gr=dat$GWL
# Zeitreihe 
zr<-ts(gr,start=c(2007,4),end=c(2015,52),frequency=52)
plot.ts(zr,xlab="Zeit",ylab="y",main="Testreihe")
Wenn ich diesen mit der einzeln geladenen Datei ausführe (s.Code), gibt es keine Probleme.
Nun möchte ich den Code auf alle Dateien in diesem Ordner "data"anwenden.
Wie mache ich das?

Vielen Dank.
Gruß
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Schleife für viele Dateien

Beitrag von jogo »

Hallo Student_L,

bei mir sieht das momentan so aus:

Code: Alles auswählen

setwd("C:/Users/Documents/Master/Projekt/data") # Arbeitsverzeichnis setzten
Dateien <- dir(pattern="*.csv")

auswert <- function(Datei) {
  daten <- read.csv(Datei)
  dat <- subset(daten, Date>="2007-01-22") # Kürzen der Daten (ab 22.01.2007)
  list(ze=dat$Date, gr=dat$GWL, zr=ts(dat$GWL, start=c(2007,4), end=c(2015,52), frequency=52))
}

# erster Test:
L <- auswert("AB_113.csv")
plot.ts(L[[1]]$zr, xlab="Zeit", ylab="y", main="Testreihe")

L <- auswert(Dateien) ### alle Dateien
Den Grafik-Teil habe ich jetzt erstmal außen vor gelassen. Bei so vielen Grafiken musst Du Dir sowieso Gedanken machen, wie die Ausgabe geschehen soll.
Üblicherweise nimmt man für das Gesamtkunstwerk wieder lapply() und lässt es über die Liste L laufen mit einer kleinen Funktion, die den künstlerischen Teil ausführt.

Gruß, Jörg
Student_L
Beiträge: 8
Registriert: Di Mai 19, 2020 1:34 pm

Re: Schleife für viele Dateien

Beitrag von Student_L »

Hallo Jörg,

vielen lieben Dank.
Jetzt läuft es bei mir :D

Mit den Graphiken funktioniert es dann in einer gesonderten Funktion und lappy() genau so?
Ich habe vor, diese einzeln zu speichern (wahrscheinlich in eine pdf oder als png).

Hast du Erfahrungswerte, ob es geschickter ist eine große Funktion mit vielen Befehlen laufen zu lassen
oder besser viele kleinere Funktionen?

Gruß
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Schleife für viele Dateien

Beitrag von jogo »

Hallo Student_L,
Student_L hat geschrieben: Mo Jun 08, 2020 11:16 am Jetzt läuft es bei mir :D
prima 8-)
Mit den Graphiken funktioniert es dann in einer gesonderten Funktion und lappy() genau so?
Ich habe vor, diese einzeln zu speichern (wahrscheinlich in eine pdf oder als png).
ja, eventuell auch mapply()
Je nachdem, was die Funktion machen soll, kann einem gelegentlich auch das Scoping im Wege stehen
- auch dafür gibt es Möglichkeiten in R, diese Schwierigkeiten zu überwinden, siehe
https://stackoverflow.com/a/62284197/5414452
Für meinen Geschmack ist das aber eine ziemlich große Brechstange, die man bei einer solchen Lösung verwendet.
Ich würde dann doch eher eine for-Schleife dafür nehmen. Dabei ist es aber besonders wichtig, dass der Code übersichtlich und klar strukturiert ist.
Hast du Erfahrungswerte, ob es geschickter ist eine große Funktion mit vielen Befehlen laufen zu lassen
oder besser viele kleinere Funktionen?
kleinere Funktionen sind besser - so dass man deren Aufgabe gut überschauen kann.
- So lassen sich später Fehler einfacher finden und die Funktionen können einfacher wiederverwendet werden.

Gruß, Jörg
Student_L
Beiträge: 8
Registriert: Di Mai 19, 2020 1:34 pm

Re: Schleife für viele Dateien

Beitrag von Student_L »

Super vielen Dank.
Antworten