3.5 Listas

Una lista en R es un objeto que permite una estructura de datos complicada, una super estructura. Esto porque permite reunir diferentes tipos de objetos:

  • Vectores
  • Matrices
  • Dataframes
  • Listas
Es decir, puede almacenar cualquier cosa.

Muchas funciones que usarás en el futuro, sobre todo de modelación, regresan resultados de estructuras complicadas y lo almacenan en listas. Por ejemplo, la función lm().


3.5.1 Crear una lista

La función list() permite crear una lista.

ejem_list <- list(
  vector = 1:10,
  matriz = matrix(1:9, nrow = 3),
  dataframe = mtcars[1:5,]
)
ejem_list
## $vector
##  [1]  1  2  3  4  5  6  7  8  9 10
## 
## $matriz
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
## 
## $dataframe
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2



3.5.2 Nombres de elementos

Equivalente a un vector, la función names() permite extraer el nombre de cada elemento de la lista.

names(ejem_list) 
## [1] "vector"    "matriz"    "dataframe"

También permite modificar los nombres.

names(ejem_list) <-  c("vec", "mat", "df")
ejem_list
## $vec
##  [1]  1  2  3  4  5  6  7  8  9 10
## 
## $mat
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
## 
## $df
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2

La función length() nos dice cuantos elementos tiene la lista.

length(ejem_list)
## [1] 3



3.5.3 Selección de elementos en una lista

La selección de elementos de una lista puede realizarse de tres maneras:

  1. [ ]
ejem_list[1]
## $vec
##  [1]  1  2  3  4  5  6  7  8  9 10
  1. [[ ]]
ejem_list[[1]]
##  [1]  1  2  3  4  5  6  7  8  9 10
  1. $
ejem_list$vector
## NULL



3.5.4 Nuevos valores a la lista

Existen dos formas de agregar nuevos valores a la lista.

Supongamos que deseamos agregar a la lista de ejemplos un número aleatorio de la distribución normal.

rand_num <- rnorm(1)
rand_num
## [1] 0.4796716

Una forma es usando la función combine c(), similar a un vector:

ejem_list_random <- c(ejem_list, 
                           random = rand_num)
ejem_list_random
## $vec
##  [1]  1  2  3  4  5  6  7  8  9 10
## 
## $mat
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
## 
## $df
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## 
## $random
## [1] 0.4796716

La segunda es usando el signo $

ejem_list_random$random_num <- rand_num
ejem_list_random
## $vec
##  [1]  1  2  3  4  5  6  7  8  9 10
## 
## $mat
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
## 
## $df
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## 
## $random
## [1] 0.4796716
## 
## $random_num
## [1] 0.4796716



3.5.5 Funciones útiles para listas

Algunas funciones que pueden ayudarte en un futuro para manipular listas son:

  • unlist()
unlist(ejem_list)
##     vec1     vec2     vec3     vec4     vec5     vec6     vec7     vec8 
##    1.000    2.000    3.000    4.000    5.000    6.000    7.000    8.000 
##     vec9    vec10     mat1     mat2     mat3     mat4     mat5     mat6 
##    9.000   10.000    1.000    2.000    3.000    4.000    5.000    6.000 
##     mat7     mat8     mat9  df.mpg1  df.mpg2  df.mpg3  df.mpg4  df.mpg5 
##    7.000    8.000    9.000   21.000   21.000   22.800   21.400   18.700 
##  df.cyl1  df.cyl2  df.cyl3  df.cyl4  df.cyl5 df.disp1 df.disp2 df.disp3 
##    6.000    6.000    4.000    6.000    8.000  160.000  160.000  108.000 
## df.disp4 df.disp5   df.hp1   df.hp2   df.hp3   df.hp4   df.hp5 df.drat1 
##  258.000  360.000  110.000  110.000   93.000  110.000  175.000    3.900 
## df.drat2 df.drat3 df.drat4 df.drat5   df.wt1   df.wt2   df.wt3   df.wt4 
##    3.900    3.850    3.080    3.150    2.620    2.875    2.320    3.215 
##   df.wt5 df.qsec1 df.qsec2 df.qsec3 df.qsec4 df.qsec5   df.vs1   df.vs2 
##    3.440   16.460   17.020   18.610   19.440   17.020    0.000    0.000 
##   df.vs3   df.vs4   df.vs5   df.am1   df.am2   df.am3   df.am4   df.am5 
##    1.000    1.000    0.000    1.000    1.000    1.000    0.000    0.000 
## df.gear1 df.gear2 df.gear3 df.gear4 df.gear5 df.carb1 df.carb2 df.carb3 
##    4.000    4.000    4.000    3.000    3.000    4.000    4.000    1.000 
## df.carb4 df.carb5 
##    1.000    2.000
  • str()
str(ejem_list)
## List of 3
##  $ vec: int [1:10] 1 2 3 4 5 6 7 8 9 10
##  $ mat: int [1:3, 1:3] 1 2 3 4 5 6 7 8 9
##  $ df :'data.frame': 5 obs. of  11 variables:
##   ..$ mpg : num [1:5] 21 21 22.8 21.4 18.7
##   ..$ cyl : num [1:5] 6 6 4 6 8
##   ..$ disp: num [1:5] 160 160 108 258 360
##   ..$ hp  : num [1:5] 110 110 93 110 175
##   ..$ drat: num [1:5] 3.9 3.9 3.85 3.08 3.15
##   ..$ wt  : num [1:5] 2.62 2.88 2.32 3.21 3.44
##   ..$ qsec: num [1:5] 16.5 17 18.6 19.4 17
##   ..$ vs  : num [1:5] 0 0 1 1 0
##   ..$ am  : num [1:5] 1 1 1 0 0
##   ..$ gear: num [1:5] 4 4 4 3 3
##   ..$ carb: num [1:5] 4 4 1 1 2