Conceptos básicos

Una lista en R es un objeto cuyas entradas pueden ser números, vectores y/o data.frame’s. Por ejemplo, cremos una lista que almacene en sus dos primeras entradas, dos vectores, y que en la siguiente entrada genere un data.frame cuyas columnas sean tales vectores.
rm(list = ls())
set.seed(1987)
x <- runif(10,2,5)  # generamos 10 numeros aleatorios uniformes entre [2,5]
y <- rnorm(10,15,3) # generamos 10 numeros aleatorios normales de media 15 y desviacion estandar de 3
lista <- list(a=x, b=y, c=data.frame(x,y))
Existen varias formas equivalentes de llamar a un elemento de una lista:
lista$a
##  [1] 2.296293 4.415145 3.822722 3.148497 4.993411 4.977279 3.148723
##  [8] 2.698193 3.789526 3.037013
lista[[1]]
##  [1] 2.296293 4.415145 3.822722 3.148497 4.993411 4.977279 3.148723
##  [8] 2.698193 3.789526 3.037013
lista$c
##           x         y
## 1  2.296293 15.805805
## 2  4.415145 16.733891
## 3  3.822722 13.400677
## 4  3.148497 11.728232
## 5  4.993411 17.723527
## 6  4.977279 13.470132
## 7  3.148723 15.317252
## 8  2.698193 14.981638
## 9  3.789526  9.847181
## 10 3.037013 16.344272
lista[[3]]
##           x         y
## 1  2.296293 15.805805
## 2  4.415145 16.733891
## 3  3.822722 13.400677
## 4  3.148497 11.728232
## 5  4.993411 17.723527
## 6  4.977279 13.470132
## 7  3.148723 15.317252
## 8  2.698193 14.981638
## 9  3.789526  9.847181
## 10 3.037013 16.344272
Por ejemplo, si queremos determinar quien es el quinto elemento del segundo elemento elemento de nuestra lista, lo podemos hacer de dos formas:
lista$b[5]
## [1] 17.72353
lista[[2]][5]
## [1] 17.72353
Podemos crear listas vacías y llenarlas a través de un for. Por ejemplo, podemos llenar en cada elemento de una lista, un vector aleatorio de diferentes dimensiones, como se ilustra a continuación:
rm(list = ls())
set.seed(1987)
lista2 <- list()
n <- 10
for (i in 1:n) {
  lista2[[i]] <- runif(i,2,5)
}
lista2
## [[1]]
## [1] 2.296293
## 
## [[2]]
## [1] 4.415145 3.822722
## 
## [[3]]
## [1] 3.148497 4.993411 4.977279
## 
## [[4]]
## [1] 3.148723 2.698193 3.789526 3.037013
## 
## [[5]]
## [1] 3.817646 4.231153 4.155067 2.534407 2.890938
## 
## [[6]]
## [1] 3.402144 2.413180 3.968950 4.454058 3.139918 2.915123
## 
## [[7]]
## [1] 2.039117 3.626330 3.654594 3.492675 2.877256 2.128803 2.642409
## 
## [[8]]
## [1] 4.018868 3.799652 4.149620 2.597014 3.327200 3.308157 3.210291 2.984963
## 
## [[9]]
## [1] 3.077262 4.360543 2.846235 4.842422 4.064210 4.110764 3.063852 3.447566
## [9] 3.202773
## 
## [[10]]
##  [1] 2.459022 2.713820 3.551228 4.560394 3.419739 3.831390 3.093279
##  [8] 3.314575 2.787503 2.172409
Como puedes observar, en una lista podemos colocar objetos de diferentes clases (como en ejemplo anterior, ya que todos los objetos de la lista eran vectores incluso de diferentes dimensiones). La versatilidad de las listas permite almacenar información de diferente tipo, y con solo llamar a la componente correspondiente deseada, evitamos algunas líneas de código. Por ejemplo, podemos hacer un plor de la quinta muestra generada con el anterior for.
grafico <- plot(lista2[[5]],type="l", xlab = "Indice", main = "Grafica de lineas para lista2[[5]]")

Veamos como generar una tabla a partir de una lista de 3 elementos. Primero, crearemos la lista, en la que cada elemento corresponde a una muestra aleatoria de tamaño 30 proveniente de una distribución exponencial de media 20. A partir de ella, supongamos que queremos crear la tabla que contenga las 3 muestras de tamaño 30.
rm(list = ls())
set.seed(1987)
lista3 <- list()
n <- 3
for (i in 1:n) {
  lista3[[i]] <- rexp(30,1/20) # generamos 30 numeros aleatorios exponenciales de media 20
}
tabla <- cbind(lista3[[1]],lista3[[2]],lista3[[3]])
colnames(tabla) <- c("Muestra 1", "Muestra 2", "Muestra 3")
tabla
##       Muestra 1  Muestra 2 Muestra 3
##  [1,] 53.193372  34.894084  6.176062
##  [2,] 12.201937  18.914964 22.145878
##  [3,]  4.302958  14.659640 25.875426
##  [4,] 24.489520  18.785074  1.550824
##  [5,]  3.226338  35.667693 32.959839
##  [6,] 21.516620  38.943268 36.278296
##  [7,]  4.235277  81.176181 51.765479
##  [8,]  9.748707  36.647024 42.419545
##  [9,]  8.734226  10.165013 22.714500
## [10,] 36.227601  26.781216 18.988088
## [11,] 17.621303 102.390086 38.409504
## [12,] 15.772243   3.672293 11.839004
## [13,] 12.720770   7.844598  1.315505
## [14,] 24.260759  14.180151  8.032410
## [15,] 18.266236  23.691437 53.055269
## [16,] 96.557799  15.005700 79.463258
## [17,]  1.684395   4.839278 50.143297
## [18,]  2.061259   1.048305 14.537373
## [19,] 14.458138  28.408240 28.277488
## [20,]  3.995358   1.490276 23.116146
## [21,]  8.661605   3.439813 26.810988
## [22,] 39.566628   1.818631 31.185414
## [23,] 19.455675  20.098685  9.362187
## [24,] 20.128633   5.004756 39.039363
## [25,] 22.589930   8.789469 15.567196
## [26,] 11.473905  51.027170 19.236921
## [27,] 16.429200   3.779442 14.455678
## [28,]  9.538674  10.335267 19.498355
## [29,] 22.232338  11.898324  3.420507
## [30,] 15.984076   9.864298  7.950115

Ejemplo práctico

Supongamos que en la sección de bebidas de una empresa de cines se disponen de 4 máquinas dispensadoras para cada tipo de bebida. La máquina 1 tiene una media de llenado de 15 ml y una desviación estándar de 0.5 ml; la máquina 2 tiene una media de llenado de 20 ml y una desviación estándar de 1.0 ml; la máquina 3 tiene una media de llenado de 18 ml y una desviación estándar de 0.2 ml y la máquina 4 tiene una media de llenado de 16 ml y una desviación estándar de 0.4 ml. Cada día se deben tomar 10 muestras de cada máquina, durante 8 días. Realiza una simulación de dicho experimento haciendo uso de listas.

Solución

Para clarificar más el experimento, simularemos lo que sucede en día para ver la mecánica de la simulación.
rm(list = ls())
set.seed(1987)
n <- 10
a <- rnorm(n,15,0.5)
b <- rnorm(n,20,1.0)
c <- rnorm(n,18,0.2)
d <- rnorm(n,16,0.4)
Lo anterior permite simular lo que sucedería un día. Ahora necesitamos simular lo que sucederá durante los 8 días que se llevará el experimento. La clave, usando listas, es reciclar lo que ya hicimos en un día, y usar un for que repita esta operación para los 8 días. Por esta razón, el uso de listas se hace pertinente. Cabe resaltar que este ejemplo de simulación puede realizarse usando matrices, ya que cada día se toma una muestra del mismo tamaño para cada máquina; sin embargo, existen situaciones en la vida cotidiana en la que las muestras por día pueden no ser del mismo tamaño: un claro ejemplo de esto sucede en las filas de los bancos, ya que cada día puede llegar un número distinto de clientes para solicitar un servicio.
rm(list = ls())
set.seed(1987)
m <- 8
a <- list()
b <- list()
c <- list()
d <- list()
tabla <- list()

for (j in 1:m) {
  
n <- 10
a[[j]] <- rnorm(n,15,0.5)
b[[j]] <- rnorm(n,20,1.0)
c[[j]] <- rnorm(n,18,0.2)
d[[j]] <- rnorm(n,16,0.4)

tabla[[j]] <- cbind(a[[j]],b[[j]],c[[j]],d[[j]])
colnames(tabla[[j]]) <- c(paste("Maq. 1, dia ",j),paste("Maq. 2, dia ",j),paste("Maq. 3, dia ",j),paste("Maq. 4, dia ",j))
}

Observa el uso del comando paste: este nos permitió anidar cadenas de caracteres con variables. Esta es una forma de colocar etiquetas que dependen de una variable, ya que R no permite colocar dentro de caracteres el valor de una variable (haz la prueba poniendo solamente “Maq. 1 dia, j” en vez de paste(“Maq. 1, dia”,j) y notarás que j será interpretado como caracter y no como variable).

Podemos ver la simulación cada día, simplemente digitando tabla[[\(j\)]], para \(j=1,2,\ldots,8\). Por ejemplo, en el día 5:
tabla[[5]]
##       Maq. 1, dia  5 Maq. 2, dia  5 Maq. 3, dia  5 Maq. 4, dia  5
##  [1,]       15.00510       21.75612       17.90567       15.59845
##  [2,]       15.37919       18.97733       18.16021       16.36036
##  [3,]       13.70603       20.19553       17.64590       16.25645
##  [4,]       15.33667       18.75061       17.97345       16.45142
##  [5,]       14.65144       21.49800       17.75967       16.50262
##  [6,]       15.36272       21.33335       17.81438       15.84524
##  [7,]       14.08599       21.64395       18.24877       15.31314
##  [8,]       14.73563       20.28528       18.08100       16.17010
##  [9,]       15.39589       20.31548       17.77871       15.99445
## [10,]       14.77885       20.32828       17.56007       15.88612
Podemos también ver la simulación todos los días, simplemente digitando tabla.
tabla
## [[1]]
##       Maq. 1, dia  1 Maq. 2, dia  1 Maq. 3, dia  1 Maq. 4, dia  1
##  [1,]       14.35569       19.49004       18.09808       16.27501
##  [2,]       15.13650       20.10575       17.92542       14.96831
##  [3,]       16.42425       19.99388       17.94981       16.20530
##  [4,]       14.85107       18.28239       17.85741       15.95882
##  [5,]       15.12216       20.44809       18.21028       17.17059
##  [6,]       15.13430       20.57259       18.05611       15.44444
##  [7,]       15.28898       19.85511       17.96889       16.12322
##  [8,]       14.73345       19.75552       17.68472       15.68761
##  [9,]       14.45471       19.63910       17.81280       15.71336
## [10,]       15.45392       19.42332       17.60764       15.93930
## 
## [[2]]
##       Maq. 1, dia  2 Maq. 2, dia  2 Maq. 3, dia  2 Maq. 4, dia  2
##  [1,]       14.38004       20.39723       18.53905       15.80975
##  [2,]       15.10863       19.74706       17.73776       15.97199
##  [3,]       14.43960       19.20327       18.10535       15.90539
##  [4,]       15.71049       19.22007       17.60293       16.15929
##  [5,]       15.15948       21.78649       18.13817       15.72608
##  [6,]       15.92498       18.68528       17.97112       16.27129
##  [7,]       14.33571       20.49113       17.66838       15.41897
##  [8,]       14.69756       19.82133       17.93133       15.58575
##  [9,]       15.25179       19.51564       17.78979       15.36305
## [10,]       15.41629       21.04485       17.82859       15.61587
## 
## [[3]]
##       Maq. 1, dia  3 Maq. 2, dia  3 Maq. 3, dia  3 Maq. 4, dia  3
##  [1,]       14.69988       19.57458       17.94417       15.95587
##  [2,]       15.46071       19.51648       17.93458       16.97685
##  [3,]       14.83613       20.23018       17.76370       15.87860
##  [4,]       14.61664       21.01390       17.67250       16.30733
##  [5,]       15.47009       21.76702       17.89524       16.42241
##  [6,]       14.96974       20.30727       18.21899       15.71762
##  [7,]       14.67510       17.62636       18.36634       15.98530
##  [8,]       14.94121       18.75837       17.97895       16.41895
##  [9,]       14.44750       19.81588       17.78406       16.57836
## [10,]       14.31230       18.00463       17.75975       16.48069
## 
## [[4]]
##       Maq. 1, dia  4 Maq. 2, dia  4 Maq. 3, dia  4 Maq. 4, dia  4
##  [1,]       15.17988       20.86055       18.13376       15.93639
##  [2,]       14.76790       20.08499       17.95671       16.53112
##  [3,]       15.69119       20.31903       18.03769       16.02792
##  [4,]       14.69923       18.13400       18.18059       15.91442
##  [5,]       15.08011       19.97182       18.03099       16.13660
##  [6,]       15.46311       20.36912       18.12745       16.59744
##  [7,]       15.25698       19.41064       18.28307       16.40112
##  [8,]       16.01550       19.74118       18.10112       15.83623
##  [9,]       14.57551       21.13083       18.41864       15.66788
## [10,]       15.21222       19.99602       18.09078       15.89525
## 
## [[5]]
##       Maq. 1, dia  5 Maq. 2, dia  5 Maq. 3, dia  5 Maq. 4, dia  5
##  [1,]       15.00510       21.75612       17.90567       15.59845
##  [2,]       15.37919       18.97733       18.16021       16.36036
##  [3,]       13.70603       20.19553       17.64590       16.25645
##  [4,]       15.33667       18.75061       17.97345       16.45142
##  [5,]       14.65144       21.49800       17.75967       16.50262
##  [6,]       15.36272       21.33335       17.81438       15.84524
##  [7,]       14.08599       21.64395       18.24877       15.31314
##  [8,]       14.73563       20.28528       18.08100       16.17010
##  [9,]       15.39589       20.31548       17.77871       15.99445
## [10,]       14.77885       20.32828       17.56007       15.88612
## 
## [[6]]
##       Maq. 1, dia  6 Maq. 2, dia  6 Maq. 3, dia  6 Maq. 4, dia  6
##  [1,]       14.86953       18.58554       18.04295       15.66461
##  [2,]       14.88291       18.85424       17.82996       16.13783
##  [3,]       14.54236       21.85812       18.17893       16.14771
##  [4,]       15.42556       17.69666       18.35923       16.39300
##  [5,]       15.61763       18.87413       18.00232       15.13348
##  [6,]       15.58795       19.33928       17.98994       17.04652
##  [7,]       14.93815       22.27116       18.07616       16.18813
##  [8,]       15.26271       20.61034       17.91964       15.26651
##  [9,]       15.26625       21.27245       18.03933       16.35979
## [10,]       15.25351       20.23518       18.11216       15.84316
## 
## [[7]]
##       Maq. 1, dia  7 Maq. 2, dia  7 Maq. 3, dia  7 Maq. 4, dia  7
##  [1,]       15.32320       20.86366       18.43094       16.31283
##  [2,]       14.74150       20.83992       17.98874       15.65829
##  [3,]       15.13318       19.64216       18.04576       14.97843
##  [4,]       14.47474       20.71775       17.97945       15.74906
##  [5,]       14.01300       20.69205       17.95319       16.19401
##  [6,]       14.71684       21.50927       18.34549       16.59158
##  [7,]       14.86314       18.84038       17.78060       15.97705
##  [8,]       14.27888       21.36656       17.85231       15.65324
##  [9,]       15.20179       19.73684       17.59597       15.26697
## [10,]       15.80079       19.10953       17.99671       16.22499
## 
## [[8]]
##       Maq. 1, dia  8 Maq. 2, dia  8 Maq. 3, dia  8 Maq. 4, dia  8
##  [1,]       15.23918       19.98281       18.17445       16.33183
##  [2,]       14.83401       19.91528       18.05859       16.10402
##  [3,]       15.54157       20.25495       18.36197       15.94725
##  [4,]       15.43327       20.53473       18.10222       15.62682
##  [5,]       16.09043       20.58800       17.50008       15.79430
##  [6,]       15.86437       21.59014       18.10506       16.37244
##  [7,]       14.88598       19.04445       17.68939       15.59848
##  [8,]       14.22673       20.57485       18.04921       16.42202
##  [9,]       15.98448       18.76661       18.33864       16.01602
## [10,]       14.75807       18.93378       17.83554       16.45581