2016-12-05 2 views
2

Lassen Sie uns die Datentabelle betrachten:Wie exportiert man eine Datentabelle für jeden Schlüssel?

> dt=data.table(v1=1:10, v2=c(rep("a",5),rep("b",5))) 
    v1 v2 
1: 1 a 
2: 2 a 
3: 3 a 
4: 4 a 
5: 5 a 
6: 6 b 
7: 7 b 
8: 8 b 
9: 9 b 
10: 10 b 

Wie würde ich tun dt in so viele Dateien zu exportieren, da es v2 Benennung der Dateien nach ihnen? Das bedeutet eine Datei mit dem Namen a, die 1 2 3 4 5 enthält, und eine Datei mit dem Namen b, die 6 7 8 9 10 enthält.

Ich versuchte: dt[, fwrite(.(v1), v2), by=v2], aber ohne Erfolg.

Alternativ, wie würde ich die dt in einer einzigen Datei, wie folgend formated exportieren:

1 2 3 4 5 
6 7 8 9 10 
+0

Sie müssen die Frage ausfüllen, indem Sie zeigen, welche Bibliotheken Sie verwenden. Insbesondere, wo sind 'fwrite' und' .'? –

+2

'fwrite' und' .' sind beide in data.table –

+0

'.' ist ein Alias ​​für' list' Funktion – jangorecki

Antwort

1

Wie wäre:

Labels = unique(dt$v2) 
for(lab in Labels) { 
    FileName = paste("DT_", lab, ".csv", sep="") 
    write.csv(dt[dt$v2 == lab, ], FileName) 
} 
1

Wir können auch split die 'dt' in list basierend auf der ' v2 'und dann fwrite

lst <- split(dt, dt$v2) 
invisible(lapply(names(lst), function(nm) fwrite(lst[[nm]], paste0("DT_", nm, ".csv")))) 
+2

Wenn Sie nicht an dem Rückgabewert interessiert sind, was gibt 'lapply' Ihnen das' '' nicht ? –

+0

@MatthewLundberg Ich habe 'unsichtbar' verwendet, um es nicht auf der Konsole zu drucken. Meine Methode ist etwas besser, da ich 'split' statt' == ' – akrun

+0

@MatthewLundberg' lapply' gebe einfachere wiederverwendbare Codestücke, benutze nur Funktionen wieder, die an 'lapply' übergeben wurden, dies ist nicht möglich mit 'for' loop – jangorecki

2

Tak en von meiner anderen Antwort here.

dt[, fwrite(.SD, paste0(.BY,".csv")), by=v2, .SDcols="v1"] 

Wenn Sie Gruppe von mehreren Spalten, nur .BY mit paste(., collapse="_") wickeln.

Verwandte Themen