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 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"
data.frames
dentro de una listaLas 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
.
apply(X, MARGIN, FUN, ...)
X
: matriz o data.frame
MARGIN
: 1
para aplicar por filas,
2
para columnasFUN
: la función que deseas aplicar (por ejemplo:
mean
, sum
, summary
, etc.)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
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
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.
# 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
for
para leer múltiples archivosEn 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
df_list <- list()
df_list
.for (ii in 1:10)
ii
irá tomando valores del 1 al 10
automáticamente:
ii = 1
ii = 2
ii = 10
{}
.read.csv(filenames[ii])
filenames
es un vector que contiene los nombres de los
archivos .csv
que queremos leer.filenames[ii]
accede al archivo
correspondiente según el valor de ii
.
ii = 3
, se leerá el archivo
filenames[3]
.read.csv()
carga ese archivo y lo convierte en un
data.frame
.df_list[[ii]] <- ...
read.csv()
se guarda dentro de la lista
df_list
en la posición ii
.df_list[[1]]
, el segundo a
df_list[[2]]
, y así sucesivamente.Después de que el bucle termina:
df_list
contiene 10 objetos tipo
data.frame
, uno por cada archivo leído.df_list[[1]]
,
df_list[[2]]
, …, df_list[[10]]
.for
looplibrary(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()
.
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 |