presentacion - superponer graficas en r
¿Cómo dividir un marco de datos? (8)
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
Quiero dividir un marco de datos 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.
Dividir el marco de datos 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 sintaxis 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.
La respuesta que desee depende en gran medida de cómo y por qué desea dividir el marco de datos.
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 marco de datos 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 marco de datos terminen en un objeto conveniente, como una lista, que lo ayudará a realizar el mismo comando en cada fragmento del marco de datos.
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,])
Si desea dividir un marco de datos 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.
También es posible que desee cortar el marco de datos 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 podrías usar
data2 <- data[data$sum_points == 2500, ]
Esto hará que un marco de datos 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
subconjunto () también es útil
subset(DATAFRAME, COLUMNNAME == "")
Para un paquete de encuesta, ¿tal vez el paquete "encuesta" sea pertinente?