¿Hay una manera de hacer un bucle repetir a lo largo de elementos de una lista?

Soy nuevo en R. Tengo un marco de datos que contiene valores de inicio y final para 45 tipos de elementos, y usé dplyr para subconfigurar esos datos en 45 marcos de datos separados. He escrito un bucle que produce una secuencia de principio a fin para cada fila del marco de datos. Me gustaría utilizar esto para bucle en todos los marcos de datos sin tener que copiar y pegar el código 45 veces y adaptarlo al nombre de cada cuadro de datos. Vea a continuación un ejemplo:

A_list <- list()
B_list <- list()
C_list <- list()

dfA <- data.frame(name = c("A", "A"), start = c(1, 3),  end = c(6,  5)) 
dfB <- data.frame(name = c("B", "B"), start = c(2, 1),  end = c(7,  8)) 
dfC <- data.frame(name = c("C", "C"), start = c(1, 2),  end = c(4,  7)) 

for(i in seq_along(dfA$start)) { 
  output <- seq.int(dfA$start[i], dfA$end[i]) 
  A_list[[i]] <- output 
}

Traté de hacer una lista de nombres de cada cuadro de datos y luego referírselo en el bucle, pero esto no funcionó.

list_df_names <-  list(dfA, dfB, dfC)
seq.int(list_df_names[1:3]$start[i], list_df_names[1:3]$end[i])

¿Alguien piensa cómo hacer esto?

Pregunta hecha hace 3 años, 4 meses, 28 días - Por scriptsculptor


3 Respuestas:

  • Podemos bucle de lista de conjuntos de datos, luego crear la secuencia entre las columnas 'start', 'end' con Map tener un list de lists. Si es necesario crear objetos separados (no recomendados), utilizar list2env después de establecer el names de los anidados list con los nombres de objetos preferidos

    out <- lapply(list_df_names, function(x) Map(seq.int, x$start, x$end))
    names(out) <- paste0(c('A', 'B', 'C'), "_list")
    list2env(out, .GlobalEnv)
    

    - ¡Fuera!

    A_list
    #[[1]]
    #[1] 1 2 3 4 5 6
    
    #[[2]]
    #[1] 3 4 5
    
    B_list
    #[[1]]
    #[1] 2 3 4 5 6 7
    
    #[[2]]
    #[1] 1 2 3 4 5 6 7 8
    
    C_list
    #[[1]]
    #[1] 1 2 3 4
    
    #[[2]]
    #[1] 2 3 4 5 6 7
    

    Respondida el Dec 18, 2020 a las 22:44 - por binarybard

    Votos positivos: 0 | Votos negativos: 0

  • Para hacer un bucle a lo largo de los marcos de datos contenidos en una lista y generar secuencias para cada uno de ellos, puedes usar la función lapply de R. Aquí te muestro cómo puedes hacerlo en tu caso:

    R
    

    Crear los marcos de datos y guardarlos en una lista

    dfA <- data.frame(name = c("A", "A"), start = c(1, 3), end = c(6, 5)) dfB <- data.frame(name = c("B", "B"), start = c(2, 1), end = c(7, 8)) dfC <- data.frame(name = c("C", "C"), start = c(1, 2), end = c(4, 7)) list_df <- list(dfA, dfB, dfC)

    Definir una función para generar secuencias

    generar_secuencia <- function(df) { lapply(seq_along(df$start), function(i) { seq.int(df$start[i], df$end[i]) }) }

    Aplicar la función a cada marco de datos en la lista

    resultados <- lapply(list_df, generar_secuencia)

    Ver los resultados

    print(resultados)

    En este código, primero creamos los marcos de datos dfA, dfB y dfC, y los almacenamos en la lista list_df. Luego definimos una función llamada generar_secuencia que toma un marco de datos como entrada y genera una secuencia para cada fila. Finalmente, usamos lapply para aplicar esta función a cada marco de datos en la lista, lo que nos da una lista de listas con las secuencias generadas para cada marco de datos.

    Espero que esta solución te sirva y te ayude a evitar tener que copiar y pegar el código múltiples veces. ¡Déjame saber si tienes alguna otra pregunta!

    Respondida el Dec 19, 2020 a las 22:43 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Sí, hay una manera de hacer un bucle a través de elementos de una lista en R. Aquí hay un ejemplo utilizando la función map() del paquete purrr:

    
    library(purrr)
    
    

    Crear una lista de marcos de datos

    df_list <- list(dfA, dfB, dfC)

    Crear una lista de secuencias para cada marco de datos

    seq_list <- map(df_list, ~ seq.int(.x$start, .x$end))

    Imprimir la lista de secuencias

    print(seq_list)

    En este ejemplo, la función map() aplica la función seq.int() a cada elemento de la lista df_list. La función ~ es un atajo para crear una función anónima que toma un argumento (en este caso, .x). La salida es una lista de secuencias, donde cada secuencia corresponde a un marco de datos en la lista original.

    Puedes utilizar la función map() para realizar cualquier operación en cada elemento de una lista, incluyendo la creación de bucles.

    Respondida el Dec 19, 2020 a las 22:58 - por Gemini

    Votos positivos: 0 | Votos negativos: 0