¿Qué es una lista en R?

Una lista es una estructura versátil que puede almacenar diferentes tipos de objetos, incluyendo vectores, data.frame, strings, números e incluso otras listas.

# Crear una lista simple
mi_lista <- list(
  nombre = "Ana",
  edad = 30,
  notas = c(8.5, 9.0, 10),
  aprobado = TRUE
)

mi_lista
## $nombre
## [1] "Ana"
## 
## $edad
## [1] 30
## 
## $notas
## [1]  8.5  9.0 10.0
## 
## $aprobado
## [1] TRUE

🎯 Acceso a elementos dentro de una lista

# Acceso por nombre (con doble corchete)
mi_lista[["notas"]]
## [1]  8.5  9.0 10.0
# Acceso por posición
mi_lista[[2]]
## [1] 30
# Acceso por nombre usando el operador $
mi_lista$nombre
## [1] "Ana"

🧾 Almacenar data.frames dentro de una lista

Las listas también permiten almacenar múltiples tablas:

lista_df <- list(mtcars, ToothGrowth)

🔁 apply() – Bucle vectorizado para matrices y data.frames

La función apply() permite aplicar una operación sobre las filas o columnas de un objeto tipo matrix o data.frame.

📚 Sintaxis

apply(X, MARGIN, FUN, ...)
  • X: matriz o data.frame
  • MARGIN: 1 para aplicar por filas, 2 para columnas
  • FUN: la función que deseas aplicar (por ejemplo: mean, sum, summary, etc.)

🧮 Ejemplos prácticos

➕ Calcular promedios por columna

apply(mtcars, 2, mean)
##        mpg        cyl       disp         hp       drat         wt       qsec 
##  20.090625   6.187500 230.721875 146.687500   3.596563   3.217250  17.848750 
##         vs         am       gear       carb 
##   0.437500   0.406250   3.687500   2.812500

📊 Obtener resumen estadístico por columna

apply(mtcars, 2, summary)
##              mpg    cyl     disp       hp     drat      wt     qsec     vs
## Min.    10.40000 4.0000  71.1000  52.0000 2.760000 1.51300 14.50000 0.0000
## 1st Qu. 15.42500 4.0000 120.8250  96.5000 3.080000 2.58125 16.89250 0.0000
## Median  19.20000 6.0000 196.3000 123.0000 3.695000 3.32500 17.71000 0.0000
## Mean    20.09062 6.1875 230.7219 146.6875 3.596563 3.21725 17.84875 0.4375
## 3rd Qu. 22.80000 8.0000 326.0000 180.0000 3.920000 3.61000 18.90000 1.0000
## Max.    33.90000 8.0000 472.0000 335.0000 4.930000 5.42400 22.90000 1.0000
##              am   gear   carb
## Min.    0.00000 3.0000 1.0000
## 1st Qu. 0.00000 3.0000 2.0000
## Median  0.00000 4.0000 2.0000
## Mean    0.40625 3.6875 2.8125
## 3rd Qu. 1.00000 4.0000 4.0000
## Max.    1.00000 5.0000 8.0000

❌ Alternativa manual (no recomendada)

mean(mtcars$wt)
## [1] 3.21725
mean(mtcars$gear)
## [1] 3.6875
mean(mtcars$mpg)
## [1] 20.09062

✏️ Como puedes ver, hacerlo manualmente requiere muchas líneas.
Con apply(), el mismo resultado se logra con una sola línea, haciendo tu código más limpio y eficiente.

lapply() – bucle para listas

# Devuelve una lista
my_list <-list("Lisa","Pedro","Alberto")

Contar numero de caracteres con funcion nchar par todos los elementos de la lista

lapply(my_list, nchar)
## [[1]]
## [1] 4
## 
## [[2]]
## [1] 5
## 
## [[3]]
## [1] 7

De otra forma tendría que realizarse la operación uno por uno

nchar(my_list[[1]])
## [1] 4
nchar(my_list[[2]])
## [1] 5
nchar(my_list[[3]])
## [1] 7

🔁 Uso de bucle for para leer múltiples archivos

En esta sección explicaremos paso a paso cómo funciona el siguiente bloque de código. El objetivo es leer varios archivos .csv de forma automática y almacenarlos en una lista.

# Crear lista vacía para almacenar resultados del bucle
df_list <- list()
# Almacenar archivos en vector filenames
filenames <- list.files()
for (ii in 1:10) {
  # Leer archivos con read.csv
  df_list[[ii]] <- read.csv(filenames[ii])
}

df_list

🧠 ¿Qué hace este código?

  1. df_list <- list()

    • Se crea una lista vacía llamada df_list.
    • Esta lista servirá como contenedor para guardar los resultados que obtengamos dentro del bucle.

  1. for (ii in 1:10)

    • Aquí se define un bucle que se ejecutará 10 veces.
    • La variable ii irá tomando valores del 1 al 10 automáticamente:
      • En la primera vuelta, ii = 1
      • En la segunda vuelta, ii = 2
      • En la décima vuelta, ii = 10
    • En cada vuelta, se ejecuta el bloque de código que está entre llaves {}.

  1. read.csv(filenames[ii])

    • filenames es un vector que contiene los nombres de los archivos .csv que queremos leer.
    • En cada vuelta, filenames[ii] accede al archivo correspondiente según el valor de ii.
      • Por ejemplo, si ii = 3, se leerá el archivo filenames[3].
    • read.csv() carga ese archivo y lo convierte en un data.frame.

  1. df_list[[ii]] <- ...

    • El resultado de read.csv() se guarda dentro de la lista df_list en la posición ii.
    • Así, el primer archivo va a df_list[[1]], el segundo a df_list[[2]], y así sucesivamente.

📦 Resultado final

Después de que el bucle termina:

  • df_list contiene 10 objetos tipo data.frame, uno por cada archivo leído.
  • Puedes acceder a cada uno usando df_list[[1]], df_list[[2]], …, df_list[[10]].

🎯 ¿Por qué es útil este patrón?

  • Automatiza la lectura de múltiples archivos sin repetir código.
  • Organiza los resultados en una lista accesible.
  • Es fácil de adaptar para leer 5, 100 o más archivos cambiando el rango del bucle.

🛠 Crear múltiples gráficos con for loop

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
library(cowplot)
## Warning: package 'cowplot' was built under R version 4.3.3
plot_list <- list()

for (ii in 1:ncol(mtcars)) {
  axis_titles <- colnames(mtcars[, c(1, ii)])
  my_df <- mtcars[, c(1, ii)]
  colnames(my_df) <- c("x_axis", "y_axis")

  plot_list[[ii]] <- ggplot(my_df, aes(x = x_axis, y = y_axis)) +
    geom_point() +
    xlab(axis_titles[1]) +
    ylab(axis_titles[2])
}

cowplot::plot_grid(plotlist = plot_list)

🎯 Este bucle: - Toma cada columna del mtcars (salvo la primera). - Crea un gráfico de dispersión contra la primera variable (mpg). - Almacena todos los gráficos en una lista (plot_list). - Finalmente los muestra todos juntos usando plot_grid().


🧠 ¿Cuándo usar apply, lapply, for?

Tipo Ideal para… Devuelve
for Control total / pasos secuenciales Nada (o manual)
apply Operar sobre filas o columnas Vector / matriz
lapply Operar sobre listas Lista