2012-04-03 18 views
11

Ho un dataset grande (ma il seguente è piccolo per esempio). Posso dividere il dataframe e quindi voglio produrre su più file di testo corrispondenti a lavel usato per dividere.Split dataframe in più file di output

mydata <- data.frame (var1 = rep(c("k", "l", "c"), each = 5), var2 = rnorm(5), 
     var3 = rnorm(5)) 
mydata  
    var1  var2  var3 
1  k 0.5406022 0.3654706 
2  k -0.6356879 -0.9160001 
3  k 0.2946240 -0.1072241 
4  k -0.2609121 0.1036626 
5  k 0.6206579 0.6111655 
6  l 0.5406022 0.3654706 
7  l -0.6356879 -0.9160001 
8  l 0.2946240 -0.1072241 
9  l -0.2609121 0.1036626 
10 l 0.6206579 0.6111655 
11 c 0.5406022 0.3654706 
12 c -0.6356879 -0.9160001 
13 c 0.2946240 -0.1072241 
14 c -0.2609121 0.1036626 
15 c 0.6206579 0.6111655 

ora Split

> spt1 <- split(mydata, mydata$var1) 

> spt1 

$c 
    var1  var2  var3 
11 c 0.5406022 0.3654706 
12 c -0.6356879 -0.9160001 
13 c 0.2946240 -0.1072241 
14 c -0.2609121 0.1036626 
15 c 0.6206579 0.6111655 

$k 
    var1  var2  var3 
1 k 0.5406022 0.3654706 
2 k -0.6356879 -0.9160001 
3 k 0.2946240 -0.1072241 
4 k -0.2609121 0.1036626 
5 k 0.6206579 0.6111655 

$l 
    var1  var2  var3 
6  l 0.5406022 0.3654706 
7  l -0.6356879 -0.9160001 
8  l 0.2946240 -0.1072241 
9  l -0.2609121 0.1036626 
10 l 0.6206579 0.6111655 

voglio write.table in nome della outputc, outputk e outputl. Quindi l'output è un prefisso comune seguito dal nome dell'etichetta per la variabile di raggruppamento.

write.table (spt1) 

risposta

12

Utilizzando lapply sopra i nomi di SPT1 ci permetterà di accedere al dataframes in SPT1 e il nome che possiamo utilizzare in pasta per creare i nostri file.

lapply(names(spt1), function(x){write.table(spt1[[x]], file = paste("output", x, sep = ""))}) 

Se si desidera, è possibile aggiungere un'estensione comune nell'impasto.

5

È anche possibile utilizzare una soluzione veramente veloce data.table. In questo caso, non è necessario dividere lo dataframe in un list.

library(data.table) # v1.9.7 (devel version) 

setDT(mydata) # convert your dataframe into a data.table 

# save files 
    mydata[, fwrite(.SD, paste0("output", var1,".csv")), by = var1] 

Nel caso in cui si desidera mantenere var1 nell'output, si può fare questo:

mydata[, fwrite(copy(.SD)[, var1 := var1] paste0("output", var1,".csv")), by = var1] 

ps. nota che questa risposta utilizza fwrite, che è ancora nella versione di sviluppo di data.table. Go here for install instructions. Potresti semplicemente usare write.csv o write.table, ma probabilmente vorrai una soluzione veloce nel caso in cui hai a che fare con un grande set di dati e fwrite è sicuramente one of the fastest alternatives.

+1

Forse anche degno di nota: l'OP vuole mantenere 'var1' nell'output ma' .SD' non lo contiene. Potresti provare 'c (.BY, .SD)' (non sono sicuro che funzioni) o usare il nuovo metodo 'split.data.table' (attualmente nella versione di sviluppo https://github.com/Rdatatable/data. tavolo/numeri/1389) – Frank

Problemi correlati