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.

Extraer datos de un dataframe anidado en el mismo registro

Tengo este dataframe principal:

testdataframe
       id     sensors_data
       <chr>  <list>
    1  AA     <data.frame [6 × 4]>               
    2  BB     <data.frame [6 × 4]>

Y cada dataframe de sensors_data se ve así:

         id type  value           status
      <chr><chr>  <dbl>           <int>
1   SN01TP  a     25.800          1
2   SN01HU  b     40.000          1
3   SN02VD  c     1.146           1
4   SN02C2  d     1270.000        1
5   SY01DS  e     31.000          1
6   TD01TP  f     22.500          1

Quisiera que mi dataframe principal, en lugar de solo tener sensors_data, se vea así:

   a      b       c      d         e       f
1  25.800 40.000  1.146  1270.000  31.000  22.500

He intentado hacer “unnesting” en el dataframe principal, pero eso crearía un registro por cada campo. Lo que estoy intentando es mutar el dataframe principal para acceder a los datos dentro de sensors_data, pero no puedo encontrar la forma.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una solución para obtener la salida deseada sería usar los paquetes dplyr y tidyr en R. Aquí hay un ejemplo de código:

    library(dplyr)
    library(tidyr)
    
    # Crear datos de muestra
    testdataframe <- data.frame(
      id = c("AA", "BB"),
      sensors_data = list(
        data.frame(
          id = c("SN01TP", "SN01HU", "SN02VD", "SN02C2", "SY01DS", "TD01TP"),
          type = c("a", "b", "c", "d", "e", "f"),
          value = c(25.800, 40.000, 1.146, 1270.000, 31.000, 22.500),
          status = rep(1, 6)
        ),
        data.frame(
          id = c("SN01TP", "SN01HU", "SN02VD", "SN02C2", "SY01DS", "TD01TP"),
          type = c("a", "b", "c", "d", "e", "f"),
          value = c(30.000, 45.000, 1.500, 1500.000, 40.000, 25.000),
          status = rep(1, 6)
        )
      ),
      stringsAsFactors = FALSE
    )
    
    # Usar dplyr y tidyr para pivotar los datos
    new_df <- testdataframe %>%
      unnest(sensors_data) %>%
      select(-id) %>%
      pivot_wider(names_from = type, values_from = value)
    
    # Previsualizar los resultados
    print(new_df)
    

    El dataframe resultante new_df debería lucir así:

    # A tibble: 2 x 6
          a     b     c         d     e     f
      <dbl> <dbl> <dbl>     <dbl> <dbl> <dbl>
    1  25.8    40 1.15   1270     31   22.5
    2  30      45 1.5    1500     40   25  
    

    Como puedes ver, la función unnest() se utiliza para extraer los datos de la columna anidada sensors_data, y luego la función pivot_wider() se utiliza para remodelar los datos en el formato deseado. La función select() se utiliza para eliminar la columna id, ya que no se necesita en la salida final.

Comments are closed.