2016-05-31 8 views
1

Ich möchte csv-Dateien in eine for-Schleife schreiben. Angenommen, ich habe einen Datenrahmen data mit 3 Zeilen, um es einfach zu machen, von einer Variablen x. Am Ende möchte ich, dass meine Ausgabe 200 CSV-Dateien sind, von denen jede eine Zeile mit den Daten enthält. Die erste Spalte der Daten ist die Identifikation ("ID") meiner Variablen.Schreiben Sie .csv in eine for-Schleife

Darüber hinaus werden meine Daten wie folgt beschrieben:

data: 

    ID x 
[1] a 1 
[2] b 2 
[3] c 3 

for (i in nrow(data)){ 
    write.csv(data[i,2], file = paste0("Directory/", "data[i,1], ".csv")) 
} 

ich diesen Code ausführen und eine CSV-Datei erstellt wird. Allerdings wird nur die letzte Zeile erstellt, was bedeutet, dass ich mit nur einer Datei c.csv gefunden habe.

Wissen Sie, was ich falsch mache? Ich dachte, dass es automatisch alle Archive erstellen würde. Soll ich zuerst die Ergebnisse in einer Liste speichern und dann exportieren?

+1

vielleicht zähle ich nicht, aber es scheint etwas mit Ihren Anführungszeichen zu haben. Hast du den Code 1: 1 kopiert und eingefügt? – patrick

+1

'nrow (data)' ist eine Zahl, nicht ein Haufen Zahlen, die durchlaufen werden müssen. Sie benötigen '1: nrow (Daten)' oder 'seq (nrow (Daten))'. Oder benutze einfach 'lapply'. Außerdem hast du ein extra Zitat zu '" data [i, 1] '. – alistaire

+1

Die Antwort von @Rafael ist genial. Aber ich vermute, dass es zu komplex ist, um zu veranschaulichen, warum dein Code nicht funktioniert. Schau dir die Code unten und vergleichen Sie es mit Ihren eigenen. Beachten Sie, wo ich die Apostrophe verwenden. 'für (i in 1: nrow (Daten)) { write.csv (Daten [i, 2], file = paste0 (" Verzeichnis/", data [i, 1]," .csv ")) }' Auch allgemeine Tipp in R. Rufen Sie nie Ihre Daten "Daten". Nennen Sie es "dat" oder "data1", wenn Sie es brauchen. – paleo13

Antwort

0

Keine Notwendigkeit, eine Schleife zu verwenden. Sie können einen data.table Ansatz verwenden, der effizienter und schneller ist.

library(data.table) 

# create a column with row positions 
setDT(dt)[, rowpos := .I] 

# save each line of your dataset into a separate .csv file 
dt[, write.csv(.SD, paste0("output_", rowpos,".csv")), 
        by = rowpos, .SDcols=names(dt) ] 

Geheimniskrämerei viel schneller

# Now in case you're working with a large dataset and you want 
# to make things much faster, you can use `fwrite {data.table}`* 

dt[, fwrite(.SD, paste0("output_", rowpos ,".csv")), 
       by = rowpos, .SDcols=names(dt) ] 

Mit einer Schleife

# in case you still want to use a loop, this will do the work for you: 

for (i in 1:nrow(dt)){ 
         write.csv(dt[i,], file = paste0("loop_", i, ".csv")) 
         } 

Extra: Speichern von Untergruppen von dataframe von Gruppen statt durch Reihen

# This line of code will save a separate `.csv` file for every ID 
# and name the file according to the ID 


setDT(dt)[, fwrite(.SD, paste0("output_", ID,".csv")), 
         by = ID, .SDcols=names(dt) ] 

* ps. Beachten Sie, dass fwrite immer noch in der Entwicklungsversion von data.table 1.9.7 ist. Go here für Installationsanweisungen.

+0

Hallo Rafael, danke für deine Antwort, aber ich kann immernoch nicht herausfinden, wie es geht.Ich erhalte weiterhin den folgenden Fehler: "Fehler in' [.data.frame' (vazao_total,, write.csv (copy (.SD) [, ': =' mun,: Unbenutztes Argument (von = mun) ". Hier wäre meine ID oder V1 mun. Vielleicht ich ' Ich sehe nichts ... Ich werde es weiter versuchen und dich wissen lassen, wenn ich finde, warum das passiert. Außerdem habe ich fwrite versucht (nachdem ich {data.table} über github installiert habe), aber es funktioniert auch nicht. – rebeca

+0

Hallo @rebeca, ich habe eine kleine Korrektur an den Code gemacht und jetzt sollte es funktionieren. Vergessen Sie nicht, 'library (data.table)' und 'setDT (yourdata)' zu verwenden –