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.

Leer dataframe de una lista en varios archivos RData.

Tengo un montón de archivos RData (1.RData, 2.RData… 100.RData) que contienen tres elementos de lista: “X”, “Y” y “Z”. Dentro de la lista Z hay un dataframe que quiero leer en R como un tibble anidado.

Mi método habitual para leer varios archivos obviamente no es válido:

library(tidyverse)

mis_archivos <-
  list.files(path = "ruta_a_los_archivos",
             pattern = ".RData",
             recursive = TRUE,
             full.names = TRUE)

¿Cómo demonios se supone que debo leer Z$df en mi tibble anidado?

df <-
  tibble(filename = mis_archivos) %>%
  mutate(contenido_archivo = map(
    mis_archivos,
    ~ load(.) 
  ))

Esto genera un tibble con una columna de lista donde cada lista contiene los valores de caracteres “X”, “Y” y “Z” sin todos los datos anidados dentro de cada lista.

¿Es posible leer un dataframe anidado de muchos archivos RData en un tibble anidado?

(Esta es mi primera pregunta aquí, así que intenté mi mejor esfuerzo para comunicar mi pregunta de manera satisfactoria.)

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible leer un dataframe anidado de varios archivos RData en un tibble anidado. Un enfoque sería utilizar el paquete purrr para iterar a través de cada archivo, cargar el contenido de Z en un dataframe y luego utilizar nest() para crear un dataframe anidado dentro del tibble. Aquí tienes un ejemplo de código que debería funcionar:

    library(tidyverse)
    
    my_files <- list.files(path = "ruta_a_los_archivos",
                           pattern = ".RData",
                           recursive = TRUE,
                           full.names = TRUE)
    
    df <- tibble(filename = my_files) %>%
      mutate(file_contents = map(my_files, load)) %>%
      mutate(nested_df = map(file_contents$Z, as_tibble)) %>%
      select(-file_contents) %>%
      nest(nested_df, .key = "data")
    
    

    En este código, primero utilizamos map() para cargar el contenido de cada archivo en una lista de listas, y luego utilizamos map() nuevamente para extraer solo el dataframe en el elemento Z de cada lista y convertirlo en un tibble. Luego utilizamos nest() para crear un dataframe anidado dentro de nuestro tibble, donde cada dataframe anidado corresponde a uno de nuestros archivos RData.

    Ten en cuenta que es posible que necesites modificar este código según la estructura específica de tus archivos RData. Por ejemplo, si el elemento Z está anidado más profundamente dentro de cada lista, es posible que necesites utilizar niveles adicionales de indexación o llamadas a unnest() para extraer los datos que necesitas.

Comments are closed.