Dividir el dataframe en múltiples archivos de salida

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

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 dividir

 > spt1  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 escribir.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) 

Usar lapply sobre los nombres de spt1 nos permitirá acceder a los dataframes en spt1 y al nombre que podemos usar en paste 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.

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

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

PD. tenga en cuenta que esta respuesta utiliza fwrite , que todavía está en la versión de desarrollo de data.table . Vaya aquí para obtener instrucciones de instalación . Simplemente podría usar write.csv o write.table , sin embargo, probablemente quiera una solución rápida en caso de que esté tratando con un gran conjunto de datos y fwrite es sin duda una de las alternativas más rápidas .