Tengo 144 columnas y me preguntaba cómo puedo hacer que R seleccione las primeras 4 columnas, las agrupe como otro marco de datos y luego haga que R repita lo mismo para las 4 columnas siguientes hasta que las 144 columnas estén agrupadas como 36 columnas separadas. marcos de datos? Supongo que el verdadero problema que tengo es que R haga el trabajo de agrupación automáticamente en lugar de repetir el proceso manualmente 36 veces... Los nombres de las columnas son aleatorios, por lo que no puedo explotar los patrones de los nombres de las columnas...
Muchas gracias de antemano :)
Consulte stackoverflow.com/questions/46189799/&hellipag; y stackoverflow.com/questions/35747729/…
- Ronak Shah28 de marzo de 2021 a las 7:31
Respuesta editada. Si el nombre de su marco de datos es df, haga esto
list2env(split.default(df, paste0('df', (1 + (seq_along(df) - 1) %/% 4 ))), envir = .GlobalEnv)
Creemos un df con 144 columnas
df <- as.data.frame(matrix(runif(144*5), 5))
#store number of columns in n
n <- ncol(df)
Ahora proceda de la siguiente manera para crear 36 data.frames llamados df1 a df36
library(purrr)
list2env(setNames(map(1:(n/4), ~(df[, (1 +(seq_along(df) -1) %/% 4) == .])), paste0("df", 1:(n/4))), envir = .GlobalEnv)
Explicación-
La función purrr::map crea una lista con 36 elementos (n/4), cada uno con un conjunto de datos de 4 columnas agrupadas según lo previsto. He utilizado %/%, es decir, división de enteros a este respecto. (comprobar 0:143 %/% 4) Los nombres de las columnas no se utilizan la lista resultante tendrá elementos sin nombre setNames creará así nombres de cada unoelemento de lista list2env guarda así todos los elementos de la lista en archivos df separados.También puedes hacer esto completamente en baseR, pero la sintaxis será bastante detallada. reemplace map(1:(n/4), ~(df[, (1 +(seq_along(df) -1) %/% 4) == .])) con Map(f = function(x){(df [, (1 +(seq_along(df) -1) %/% 4) == x])}, 1:(n/4)) para obtener una sintaxis completa como esta
list2env(
setNames(
Map(f = function(x){(df[, (1 +(seq_along(df) -1) %/% 4) == x])},
1:(n/4)),
paste0("df", 1:(n/4))),
envir = .GlobalEnv)
2
¿No es esto lo que esperabas? ¡Indique si el problema aún no se resuelve, ya que no ha aceptado ninguna de las respuestas!
AnilGoyal8 de abril de 2021 a las 6:27
Gracias por tu amable respuesta. Todavía estoy intentando resolverlo, pero realmente aprecio tu aporte :)
- Syl25/04/2021 a las 13:51
Puedes hacer referencia a las columnas por índice, así:
library(tidyverse)
sourceDF <- tibble(
x1=runif(5), x2=runif(5), x3=runif(5), x4=runif(5),
x5=runif(5), x6=runif(5), x7=runif(5), x8=runif(5),
x9=runif(5), x10=runif(5), x11=runif(5), x12=runif(5),
)
lapply(
seq(1, ncol(sourceDF), 4),
function(x) {
sourceDF %>% select(all_of(x:(x+3)))
}
)
[[1]]
# A tibble: 5 x 4
x1 x2 x3 x4
<dbl> <dbl> <dbl> <dbl>
1 0.997 0.733 0.614 0.933
2 0.881 0.948 0.860 0.462
3 0.772 0.410 0.359 0.694
4 0.977 0.282 0.856 0.321
5 0.976 0.421 0.405 0.493
[[2]]
# A tibble: 5 x 4
x5 x6 x7 x8
<dbl> <dbl> <dbl> <dbl>
1 0.773 0.137 0.416 0.228
2 0.161 0.844 0.358 0.990
3 0.840 0.629 0.960 0.724
4 0.115 0.751 0.404 0.847
5 0.794 0.267 0.767 0.0887
[[3]]
# A tibble: 5 x 4
x9 x10 x11 x12
<dbl> <dbl> <dbl> <dbl>
1 0.705 0.0265 0.907 0.0610
2 0.402 0.829 0.279 0.723
3 0.348 0.239 0.0203 0.483
4 0.870 0.695 0.543 0.782
5 0.532 0.475 0.543 0.0521
3
Muchas gracias, pero ¿sabes cómo puedo guardar respuestas individuales como un marco de datos?
- Syl28 de marzo de 2021 a las 8:52
1
Envuelva el lapply() en bind_rows().
- Lima28/03/2021 a las 19:17
Gracias. Lo intentaré :)
- Syl25/04/2021 a las 13:50