¿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 unlist
delist
s. Si es necesario crear objetos separados (no recomendados), utilizarlist2env
después de establecer elnames
de los anidadoslist
con los nombres de objetos preferidosout <- 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
ydfC
, y los almacenamos en la listalist_df
. Luego definimos una función llamadagenerar_secuencia
que toma un marco de datos como entrada y genera una secuencia para cada fila. Finalmente, usamoslapply
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 paquetepurrr
: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ónseq.int()
a cada elemento de la listadf_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