2016-09-06 6 views
2

Ich bin sehr neu in R, aber Programm. Ich habe wahrscheinlich gerade genug von meinen eigenen Fortschritten in diesem Stadium, also ist hier mein Problem;Lesen, Zusammenführen und Sortieren von .csv-Dateien

Viele .csv-Dateien, groß (6MB) mit Spektraldaten, die ich später analysieren muss. Ich versuche, die Daten zu lesen - zwei Spalten Frequenz und Spannung (V als dB-Werte), 500.000 Datenpunkte pro Datei. Ich möchte die Daten aus der 2. Spalte in einem neuen Datensatz für jeweils 10 Dateien zusammenführen.

ZB: 10 Dateien, zehn Frequency (alle gleich für jede kann so für den Moment ignoriert werden) und zehn Spannung. Nimm die Daten von der Spannung in der 2. Spalte und füge sie zu einem Datensatz zusammen. Wenn ich 10 Dateien habe = Ich habe einen Datensatz, 100 Dateien = 10 Datensätze. Hoffentlich hat jeder Datensatz am Ende 11 Spalten | Frequenz | V1 | V2 | ... | V10 |. Es wäre nett, für jede Datei ein Index-Match durchzuführen, aber ich bin mir nicht sicher, ob mein PC dafür in der Lage sein wird, bis ich die Ressourcen aktualisiere.

Das mag ruhig verschachtelt erscheinen, alle Vorschläge willkommen, Speicher scheint ein Problem zu sein, wenn man versucht, 1200 CSV-Dateien zu sortieren oder sogar nur 100 davon zu lesen. Vielen Dank für Ihre Zeit!

Antwort

0

Ich habe dies nicht getestet, da ich offensichtlich nicht Ihre Daten habe, aber etwas wie der folgende Code sollte funktionieren. Im Grunde erstellen Sie einen Vektor aller Dateinamen und lesen, kombinieren und schreiben 10 davon gleichzeitig.

library(reshape2) 
library(dplyr) 

# Get the names of all the csv files 
files = list.files(pattern="csv$") 

# Read, combine, and save ten files at a time in each iteration of the loop 
for (i in (unique(1:length(files)) - 1) %/% 10)) { 

    # Read ten files at a time into a list 
    dat = lapply(files[(1:length(files) - 1) %/% 10 == i], function(f) { 
    d=read.csv(f, header=TRUE, stringsAsFactors=FALSE) 
    # Add file name as a column 
    d$file = gsub("(.*)\\.csv$", "\\1", f) 
    return(d) 
    }) 

    # Combine the ten files into a single data frame 
    dat = bind_rows(dat) 

    # Reshape from long to wide format 
    dat = dcast(Frequency ~ file, value.var="Voltage") 

    # Write to csv 
    write.csv(dat, paste("Files_", i,".csv"), row.names=FALSE) 
} 

Auf der anderen Seite, wenn Sie nur wollen, um sie alle in eine einzige Datei im langen Format kombinieren, was wird Analyse erleichtern (wenn Sie genug Speicher haben natürlich):

# Read all files into a list 
    dat = lapply(files, function(f) { 
    d = read.csv(f, header=TRUE, stringsAsFactors=FALSE) 
    # Add file name as a column 
    d$file = gsub("(.*)\\.csv$", "\\1", f) 
    return(d) 
    }) 

    # Combine into a single data frame 
    dat = bind_rows(dat) 

    # Save to csv 
    write.csv(dat, "All_files_combined.csv", row.names=FALSE) 
+0

Nizza one @ eipi10, danke für die schnelle Antwort. Linie 14 Ich schätze wirklich, überall gesucht! Ein paar Fragen; 1) Können Sie 'in' Funktion erklären? Kann keinen Hinweis darauf finden. 2) Zeile 14 'rbind' oder' bind_rows', es sieht aus wie Ihre Einstellungsdaten in Zeilen, ich bin gewohnt, Tabellen und Matrixgruppendaten zu verteilen, können Sie erklären warum? Ist es eine R-Sache ?! –

+0

'für (var in seq)' ist der einzige Fall, den ich mir in R vorstellen kann, wobei 'in' in einem logischen Ausdruck verwendet wird. Es ist nur eine Möglichkeit, die Iterationen der For-Schleife einzurichten. In diesem Fall wählen wir 10 Zeilen als Zeit. In anderen Kontexten würden Sie für die Übereinstimmung zwischen Vektoren% in% verwenden, wie in x% in% y. Siehe '? \'% In% \ '' und '? Control' für weitere Informationen. – eipi10

+0

In Bezug auf 'rbind' vs.' bind_rows': 'rbind' ist eine Basis-R-Funktion zum Stapeln von zwei Datenrahmen oder Matrizen. Wenn Sie jedoch mehrere Datenrahmen in einer Liste haben und diese alle stapeln möchten, tun Sie 'do.call (rbind, dat)'. "do.call" ruft iterativ "rbind" über die gesamte Liste von Datenrahmen auf. 'bind_rows' ist eine' dplyr'-Funktion, die auf der gesamten Liste funktioniert. 'bind_rows (dat)' und 'do.call (rbind, dat)' sind in diesem Fall äquivalent. "Bind_rows" funktioniert jedoch auch, wenn die Datenrahmen nicht alle die gleichen Spaltennamen oder die gleiche Anzahl von Spalten haben. – eipi10

Verwandte Themen