es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo girar/transponer un tibble con columnas de lista.

Estoy intentando “rotar” un tibble que contiene columnas de lista. En el ejemplo a continuación, estoy tratando de pasar de trb_1 a trb_2.

library(recipes)
library(tibble)

Tengo dos “recetas” que organizo en un tibble.

car_rec1

recipe(mpg ~ ., data = mtcars) %>% step_ns(disp, deg_free = 5)

car_rec2

recipe(mpg ~ ., data = mtcars) %>% step_dummy(am)

trb_1

trb_1 <- tribble(
  ~car_rec1,                                                     ~car_rec2,
  recipe(mpg ~ ., data = mtcars) %>% step_ns(disp, deg_free = 5),   recipe(mpg ~ ., data = mtcars) %>% step_dummy(am) 
)

trb_2

trb_2 <- tribble(
  ~name, ~value,
  "car_rec1", recipe(mpg ~ ., data = mtcars) %>% step_ns(disp, deg_free = 5),
  "car_rec2", recipe(mpg ~ ., data = mtcars) %>% step_dummy(am)
)

trb_1

# A tibble: 1 x 2
  car_rec1  car_rec2
  <list>    <list>
1 <recipe>  <recipe>

trb_2

# A tibble: 2 x 2
  name      value
  <chr>     <list>
1 car_rec1 <recipe>
2 car_rec2 <recipe>

He intentado

library(sjmisc)
rotate_df(trb_1)

Pero el resultado no es el deseado (es decir, no es como el trb_2 deseado).

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para rotar el tibble trb_1 al formato deseado trb_2, puedes usar la función gather() del paquete tidyr. Aquí tienes un ejemplo de cómo hacerlo:

    library(tidyr)
    library(dplyr)
    
    trb_2 <- trb_1 %>% 
      # Agregar los nombres de filas como una nueva columna
      rownames_to_column(var = "name") %>% 
      # Reunir las columnas en filas
      gather(key = "value", value = "recipe", -name) %>% 
      # Eliminar el prefijo "car_rec_" de la columna value
      mutate(value = str_remove(value, "car_rec_")) %>% 
      # Convertir la columna "recipe" a una lista
      mutate(recipe = list(recipe))
    

    Esto debería darte el tibble trb_2 deseado:

    r
    trb_2
    #> # A tibble: 2 x 2
    #> name recipe
    #> <chr> <list>
    #> 1 car_rec_1 <recipe>
    #> 2 car_rec_2 <recipe>

Comments are closed.