¿Cómo dividir un dataframe?

Quiero dividir un dataframe en varios más pequeños. Esto parece una pregunta muy trivial, sin embargo, no puedo encontrar una solución desde la búsqueda web.

También es posible que desee cortar el dataframe en un número arbitrario de marcos de datos más pequeños. Aquí, cortamos en dos marcos de datos.

 x = data.frame(num = 1:26, let = letters, LET = LETTERS) set.seed(10) split(x, sample(rep(1:2, 13))) 

da

 $`1` num let LET 3 3 c C 6 6 f F 10 10 j J 12 12 l L 14 14 n N 15 15 o O 17 17 q Q 18 18 r R 20 20 t T 21 21 u U 22 22 v V 23 23 w W 26 26 z Z $`2` num let LET 1 1 a A 2 2 b B 4 4 d D 5 5 e E 7 7 g G 8 8 h H 9 9 i I 11 11 k K 13 13 m M 16 16 p P 19 19 s S 24 24 x X 25 25 y Y 

También puede dividir un dataframe basado en una columna existente. Por ejemplo, para crear tres marcos de datos basados ​​en la columna cyl en mtcars :

 split(mtcars,mtcars$cyl) 

Si desea dividir un dataframe de acuerdo con los valores de alguna variable, le sugiero que use daply() del paquete plyr .

 library(plyr) x < - daply(df, .(splitting_variable), function(x)return(x)) 

Ahora, x es una matriz de marcos de datos. Para acceder a uno de los marcos de datos, puede indexarlo con el nombre del nivel de la variable de división.

 x$Level1 #or x[["Level1"]] 

Sin embargo, me aseguraré de que no hay otras maneras más inteligentes de manejar tus datos antes de dividirlos en muchos marcos de datos.

Acabo de publicar un tipo de RFC que podría ayudarte: dividir un vector en fragmentos en R

 x = data.frame(num = 1:26, let = letters, LET = LETTERS) ## number of chunks n < - 2 dfchunk <- split(x, factor(sort(rank(row.names(x))%%n))) dfchunk $`0` num let LET 1 1 a A 2 2 b B 3 3 c C 4 4 d D 5 5 e E 6 6 f F 7 7 g G 8 8 h H 9 9 i I 10 10 j J 11 11 k K 12 12 l L 13 13 m M $`1` num let LET 14 14 n N 15 15 o O 16 16 p P 17 17 q Q 18 18 r R 19 19 s S 20 20 t T 21 21 u U 22 22 v V 23 23 w W 24 24 x X 25 25 y Y 26 26 z Z 

Saludos, Sebastian

También podrías usar

 data2 < - data[data$sum_points == 2500, ] 

Esto hará que un dataframe con los valores donde sum_points = 2500

Da :

 airfoils sum_points field_points init_t contour_t field_t ... 491 5 2500 5625 0.000086 0.004272 6.321774 498 5 2500 5625 0.000087 0.004507 6.325083 504 5 2500 5625 0.000088 0.004370 6.336034 603 5 250 10000 0.000072 0.000525 1.111278 577 5 250 10000 0.000104 0.000559 1.111431 587 5 250 10000 0.000072 0.000528 1.111524 606 5 250 10000 0.000079 0.000538 1.111685 .... > data2 < - data[data$sum_points == 2500, ] > data2 airfoils sum_points field_points init_t contour_t field_t 108 5 2500 625 0.000082 0.004329 0.733109 106 5 2500 625 0.000102 0.004564 0.733243 117 5 2500 625 0.000087 0.004321 0.733274 112 5 2500 625 0.000081 0.004428 0.733587 

subset() también es útil:

 subset(DATAFRAME, COLUMNNAME == "") 

Para un paquete de encuesta, ¿tal vez el paquete de la survey sea ​​pertinente?

http://faculty.washington.edu/tlumley/survey/

La respuesta que desee depende en gran medida de cómo y por qué desea dividir el dataframe.

Por ejemplo, si quiere omitir algunas variables, puede crear nuevos marcos de datos a partir de columnas específicas de la base de datos. Los subíndices entre paréntesis después del dataframe se refieren a los números de filas y columnas. Echa un vistazo a Spoetry para una descripción completa.

 newdf < - mydf[,1:3] 

O bien, puede elegir filas específicas.

 newdf < - mydf[1:3,] 

Y estos subíndices también pueden ser pruebas lógicas, como elegir filas que contengan un valor particular o factores con un valor deseado.

¿Qué quieres hacer con los trozos sobrantes? ¿Necesita realizar la misma operación en cada porción de la base de datos? Luego, querrá asegurarse de que los subconjuntos del dataframe terminen en un objeto conveniente, como una lista, que lo ayudará a realizar el mismo comando en cada fragmento del dataframe.

Si desea dividir por valores en una de las columnas, puede usar lapply . Por ejemplo, dividir ChickWeight en un conjunto de datos separado para cada chica:

 data(ChickWeight) lapply(unique(ChickWeight$Chick), function(x) ChickWeight[ChickWeight$Chick == x,]) 

Dividir el dataframe parece contraproducente. En su lugar, utilice el paradigma de dividir-aplicar-combinar, por ejemplo, generar algunos datos

 df = data.frame(grp=sample(letters, 100, TRUE), x=rnorm(100)) 

luego divide solo las columnas relevantes y aplica la función scale() a x en cada grupo, y combina los resultados (usando split< - o ave )

 df$z = 0 split(df$z, df$grp) = lapply(split(df$x, df$grp), scale) ## alternative: df$z = ave(df$x, df$grp, FUN=scale) 

Esto será muy rápido en comparación con la división de data.frames, y el resultado permanece utilizable en el análisis posterior sin iteración. Creo que la syntax de Dplyr es

 library(dplyr) df %>% group_by(grp) %>% mutate(z=scale(x)) 

En general, esta solución dplyr es más rápida que la división de marcos de datos, pero no tan rápido como split-apply-combine.