2016-04-06 12 views
0

Ich möchte einen Datenrahmen durch Einlesen einer CSV-Datei für jeden Tag im Monat erstellen. Meine täglichen CSV-Dateien enthalten Spalten mit Zeichen, Doppelpunkten und Ganzzahlen mit der gleichen Anzahl von Zeilen. Ich kenne die maximale Anzahl von Zeilen für einen bestimmten Monat und die Anzahl der Spalten bleibt für jede CSV-Datei gleich. I Schleife durch jeden Tag eines Monats mit fileListing, die die Liste der CSV-Dateinamen enthält (zum Beispiel für den Monat Januar):Progressive Anhängen von Daten aus read.csv

output <- matrix(ncol=18, nrow=2976) 
for (i in 1 : length(fileListing)){ 
    df = read.csv(fileListing[ i ], header = FALSE, sep = ',', stringsAsFactors = FALSE, row.names = NULL) 
    # each df is a data frame with 96 rows and 18 columns 

    # now insert the data from the ith date for all its rows, appending as you go 
     for (j in 1 : 18){   
      output[ , j ] = df[[ j ]] 
     } 
} 

Sorry für meine Frage überarbeitet zu haben, wie ich es (DUH) heraus Teil, aber sollte ich rbind verwenden, um Daten am unteren Rand des Datenrahmens progressiv einzufügen, oder ist das langsam?

Vielen Dank.

BSL

+0

Sie sind wahrscheinlich besser dran, sie alle in einer Liste zu lesen und 'do.call (rbind.data.frame, data)' zu verwenden, um alle auf einmal zu kombinieren. –

Antwort

1

Wenn die Daten auf Ihren verfügbaren Speicher recht klein ist, lesen Sie einfach die Daten in und sich keine Sorgen darüber. Nachdem Sie alle Daten eingelesen und eine Bereinigung vorgenommen haben, speichern Sie die Datei mit save() und lassen Sie Ihre Analyseskripte in dieser Datei mit load() lesen. Das Trennen von Lese-/Bereinigungsskripts von Analyseclips ist eine gute Möglichkeit, dieses Problem zu reduzieren.

Eine Funktion, die das Lesen von read.csv beschleunigt, ist die Verwendung der Argumente nrow und colClass. Da Sie sagen, dass Sie die Anzahl der Zeilen in jeder Datei kennen, können Sie durch die Angabe von R das Lesen beschleunigen. Sie können die Spaltenklassen mit

colClasses <- sapply(read.csv(file, nrow=100), class) 

extrahieren und dann das Ergebnis dem colClass-Argument übergeben.

Wenn die Daten fast zu groß werden, können Sie einzelne Dateien verarbeiten und Zwischenversionen speichern. Es gibt eine Reihe damit verbundener Diskussionen zum Verwalten des Speichers auf der Website, die dieses Thema abdecken.

Auf Speichernutzung Tricks: Tricks to manage the available memory in an R session

Bei Verwendung der Garbage Collector Funktion: Forcing garbage collection to run in R with the gc() command

+0

Ich dachte an diesen Schritt, aber ich möchte immer noch die monatliche Sammlung von täglichen Dateien schreiben, so dass der zweite Tag an den unteren Tag des ersten Tages der Daten im monatlichen Datenrahmen angehängt wird. Danke. –

+0

Fügen Sie einige Änderungen in Bezug auf die Argumente colClass und nrow ein. Diese helfen bei der Lesezeit und der Speichernutzung. Die Verwendung von rbind wird bei mittelgroßen Datensätzen schnell sein. – lmo

1

Sie können sie in eine Liste mit lapply lesen, dann verbinden sie alle auf einmal:

data <- lapply(fileListing, read.csv, header = FALSE, stringsAsFactors = FALSE, row.names = NULL) 
df <- do.call(rbind.data.frame, data) 
2

Definieren Sie zunächst einen Master-Datenrahmen, der alle Daten enthält. Dann fügen Sie die Daten beim Lesen jeder Datei dem Master hinzu.

masterdf<-data.frame() 
for (i in 1 : length(fileListing)){ 
    df = read.csv(fileListing[ i ], header = FALSE, sep = ',', stringsAsFactors = FALSE, row.names = NULL) 
    # each df is a data frame with 96 rows and 18 columns 
    masterdf<-rbind(masterdf, df) 
} 

Am Ende der Schleife enthält Masterdf alle Daten. Dieser Code-Code kann verbessert werden, aber für die Größe des Datasets sollte dies schnell genug sein.