2012-04-03 6 views
11

Tengo un gran conjunto de datos (pero el siguiente es pequeño, por ejemplo). Puedo dividir el marco de datos y luego quiero dar salida a un archivo de texto múltiple correspondiente a lavel utilizado para dividir.División de dataframe en múltiples archivos de salida

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 

ahora dividido

> 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 

Quiero write.table en nombre de outputc, outputk y outputl. Por lo tanto, la salida es el prefijo común seguido del nombre de la etiqueta para agrupar la variable.

write.table (spt1) 

Respuesta

12

Usando lapply sobre los nombres de SPT1 nos permitirá acceder a las tramas de datos en SPT1 y el nombre que podemos utilizar en la pasta para crear nuestros archivos.

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

Puede agregar una extensión común en el pegado si lo desea.

5

También puede usar una solución data.table realmente rápida. En este caso, no hay necesidad de dividir el dataframe en 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] 

En caso de que quiera mantener var1 en la salida, se puede hacer esto:

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

ps. tenga en cuenta que esta respuesta utiliza fwrite, que todavía está en la versión de desarrollo de data.table. Go here for install instructions. Simplemente podría usar write.csv o write.table, sin embargo, es probable que desee una solución rápida en caso de que esté tratando con un gran conjunto de datos y fwrite es ciertamente one of the fastest alternatives.

+1

Tal vez también vale la pena señalar: El OP quiere retener 'var1' en la salida, pero' .SD' no lo contiene. Podría intentar 'c (.BY, .SD)' (no estoy seguro si eso funciona) o usar el nuevo método 'split.data.table' (actualmente en la versión de desarrollo https://github.com/Rdatatable/data. table/issues/1389) – Frank

Cuestiones relacionadas