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
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:
[ ]
ejem_list[1]
## $vec
## [1] 1 2 3 4 5 6 7 8 9 10
[[ ]]
ejem_list[[1]]
## [1] 1 2 3 4 5 6 7 8 9 10
$
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