¿Cómo hacer que R seleccione y agrupe columnas automáticamente?

CorePress2024-01-25  10

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 Shah

28 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!

AnilGoyal

8 de abril de 2021 a las 6:27

Gracias por tu amable respuesta. Todavía estoy intentando resolverlo, pero realmente aprecio tu aporte :)

- Syl

25/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?

- Syl

28 de marzo de 2021 a las 8:52

1

Envuelva el lapply() en bind_rows().

- Lima

28/03/2021 a las 19:17

Gracias. Lo intentaré :)

- Syl

25/04/2021 a las 13:50

randomThread
html - Centrar todos los elementos en bootstrap 4c# - Generación automática de ID de pedidojavascript - Cómo almacenar objetos en una matriz después del método en mi clasereactjs - Reaccionar con Redux Saga - Cómo recuperar datos de una llamada de axiosAcondicionamiento de recuento de SQL sin los valores 0reactjs - ¿Cómo puedo resolver mi TypeError de gancho de reacción: setUser no es un problema de función?javascript - ¿Cómo llamar a un php con parámetro de un