Alle Dateien in einem Ordner öffnen und eine function anwenden

Ich mache eine relativ einfache Analyse, die ich in eine function für alle Dateien in einem bestimmten Ordner eingefügt habe. Ich habe mich gefragt, ob jemand irgendwelche Tipps hatte, um mir zu helfen, den process in verschiedenen Ordnern zu automatisieren.

  1. Zuerst habe ich mich gefragt, ob es eine Möglichkeit gibt, alle Dateien in einem bestimmten Ordner direkt in R zu lesen. Ich glaube, der folgende Befehl listet alle Dateien auf:

files <- (Sys.glob("*.csv"))

… die ich unter Verwenden von R gefunden habe, um alle Dateien mit einer angegebenen Erweiterung aufzulisten

Und dann liest der folgende Code alle diese Dateien in R.

 listOfFiles <- lapply(files, function(x) read.table(x, header = FALSE)) 

… aus Mehrere Dateien in R manipulieren

Aber die Dateien scheinen als eine fortlaufende Liste eingelesen zu werden und nicht einzelne Dateien … Wie kann ich das Skript ändern, um alle CSV-Dateien in einem bestimmten Ordner als einzelne Datenrahmen zu öffnen?

  1. Zweitens, unter der Annahme, dass ich alle Dateien einzeln lesen kann, wie schließe ich eine function für alle diese Datenrahmen auf einmal ab. Zum Beispiel habe ich vier kleine Datenframes erstellt, damit ich illustrieren kann, was ich will:

     Df.1 <- data.frame(A = c(5,4,7,6,8,4),B = (c(1,5,2,4,9,1))) Df.2 <- data.frame(A = c(1:6),B = (c(2,3,4,5,1,1))) Df.3 <- data.frame(A = c(4,6,8,0,1,11),B = (c(7,6,5,9,1,15))) Df.4 <- data.frame(A = c(4,2,6,8,1,0),B = (c(3,1,9,11,2,16))) 

Ich habe mir auch eine Beispielfunktion ausgedacht:

 Summary<-function(dfile){ SumA<-sum(dfile$A) MinA<-min(dfile$A) MeanA<-mean(dfile$A) MedianA<-median(dfile$A) MaxA<-max(dfile$A) sumB<-sum(dfile$B) MinB<-min(dfile$B) MeanB<-mean(dfile$B) MedianB<-median(dfile$B) MaxB<-max(dfile$B) Sum<-c(sumA,sumB) Min<-c(MinA,MinB) Mean<-c(MeanA,MeanB) Median<-c(MedianA,MedianB) Max<-c(MaxA,MaxB) rm(sumA,sumB,MinA,MinB,MeanA,MeanB,MedianA,MedianB,MaxA,MaxB) Label<-c("A","B") dfile_summary<-data.frame(Label,Sum,Min,Mean,Median,Max) return(dfile_summary)} 

Normalerweise würde ich den folgenden Befehl verwenden, um die function auf jeden einzelnen Datenrahmen anzuwenden.

Df1.summary <-Zusammenfassung (dfile)

Gibt es einen Weg, anstatt die function auf alle Datenrahmen anzuwenden, und die Titel der Datenrahmen in den Übersichtstabellen zu verwenden (zB Df1.summary).

Danke vielmals,

Katie

Im Gegenteil, ich denke, die Arbeit mit der list macht es einfach, solche Dinge zu automatisieren.

Hier ist eine Lösung (Ich habe Ihre vier Datenrahmen im Ordner temp/ gespeichert).

 filenames < - list.files("temp", pattern="*.csv", full.names=TRUE) ldf <- lapply(filenames, read.csv) res <- lapply(ldf, summary) names(res) <- substr(filenames, 6, 30) 

Es ist wichtig, den vollständigen Pfad für Ihre Dateien zu speichern (wie bei full.names ), ansonsten müssen Sie das Arbeitsverzeichnis einfügen, z

 filenames < - list.files("temp", pattern="*.csv") paste("temp", filenames, sep="/") 

wird auch funktionieren. Beachten Sie, dass ich substr zum Extrahieren von Dateinamen verwendet habe, während der vollständige Pfad verworfen wurde.

Sie können wie folgt auf Ihre Übersichtstabellen zugreifen:

 > res$`df4.csv` AB Min. :0.00 Min. : 1.00 1st Qu.:1.25 1st Qu.: 2.25 Median :3.00 Median : 6.00 Mean :3.50 Mean : 7.00 3rd Qu.:5.50 3rd Qu.:10.50 Max. :8.00 Max. :16.00 

Wenn Sie wirklich einzelne Übersichtstabellen erhalten möchten, können Sie diese später extrahieren. Z.B,

 for (i in 1:length(res)) assign(paste(paste("df", i, sep=""), "summary", sep="."), res[[i]]) 

Normalerweise verwende ich keine for-Schleife in R, aber hier ist meine Lösung mit for-Schleifen und zwei Paketen: plyr und dostats

plyr ist auf cran und du kannst dostats auf https://github.com/halpo/dostats herunterladen (benutze install_github aus dem Hadley devtools- Paket)

Angenommen, ich habe Ihre ersten beiden data.frame (Df.1 und Df.2) in CSV-Dateien, können Sie so etwas tun.

 require(plyr) require(dostats) files < - list.files(pattern = ".csv") for (i in seq_along(files)) { assign(paste("Df", i, sep = "."), read.csv(files[i])) assign(paste(paste("Df", i, sep = ""), "summary", sep = "."), ldply(get(paste("Df", i, sep = ".")), dostats, sum, min, mean, median, max)) } 

Hier ist die Ausgabe

 R> Df1.summary .id sum min mean median max 1 A 34 4 5.6667 5.5 8 2 B 22 1 3.6667 3.0 9 R> Df2.summary .id sum min mean median max 1 A 21 1 3.5000 3.5 6 2 B 16 1 2.6667 2.5 5