David Montaner (2014-03-31)
Script que introduce los comandos mas basicos de R relacionados con listas.
# rm (list = ls ())
Un grupo de objetos de R
unVector <- 1:10
unVector
#> [1] 1 2 3 4 5 6 7 8 9 10
otroVector <- LETTERS ##LETTERS es una variable definida internamente en R
otroVector
#> [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q"
#> [18] "R" "S" "T" "U" "V" "W" "X" "Y" "Z"
unaMatriz <- cbind (1:10, 10:1)
rownames (unaMatriz) <- LETTERS[1:10] #con nombres en las filas
colnames (unaMatriz) <- letters[1:2] #y en las columnas
unaMatriz
#> a b
#> A 1 10
#> B 2 9
#> C 3 8
#> D 4 7
#> E 5 6
#> F 6 5
#> G 7 4
#> H 8 3
#> I 9 2
#> J 10 1
se pueden agrupar en una estructura de lista
lista0 <- list (unVector, otroVector, unaMatriz)
class (lista0)
#> [1] "list"
length (lista0)
#> [1] 3
Acceso por orden o posicion
lista0[1]
#> [[1]]
#> [1] 1 2 3 4 5 6 7 8 9 10
lista0[1:2]
#> [[1]]
#> [1] 1 2 3 4 5 6 7 8 9 10
#>
#> [[2]]
#> [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q"
#> [18] "R" "S" "T" "U" "V" "W" "X" "Y" "Z"
lista0[c(1,3)] #reordenaciones
#> [[1]]
#> [1] 1 2 3 4 5 6 7 8 9 10
#>
#> [[2]]
#> a b
#> A 1 10
#> B 2 9
#> C 3 8
#> D 4 7
#> E 5 6
#> F 6 5
#> G 7 4
#> H 8 3
#> I 9 2
#> J 10 1
OBS: el acceso con un un unico corchete conserva la estructura de lista
class (lista0[1])
#> [1] "list"
length (lista0[1])
#> [1] 1
Hay que usar dos corchetes para obtener el objeto guardado sin la 'envoltura' de lista
lista0[[1]]
#> [1] 1 2 3 4 5 6 7 8 9 10
class (lista0[[1]])
#> [1] "integer"
length (lista0[[1]])
#> [1] 10
Los elementos de la lista se pueden nombrar
names (lista0)
#> NULL
names (lista0) <- c("uno", "dos", "tres")
names (lista0)
#> [1] "uno" "dos" "tres"
De hecho se puede generar la lista ya con los nombres
lista1 <- list (uno=unVector, dos=otroVector, tres=unaMatriz)
lista1
#> $uno
#> [1] 1 2 3 4 5 6 7 8 9 10
#>
#> $dos
#> [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q"
#> [18] "R" "S" "T" "U" "V" "W" "X" "Y" "Z"
#>
#> $tres
#> a b
#> A 1 10
#> B 2 9
#> C 3 8
#> D 4 7
#> E 5 6
#> F 6 5
#> G 7 4
#> H 8 3
#> I 9 2
#> J 10 1
Entonces se puede acceder por nombre a los elemnetos de la lista
lista1["uno"]
#> $uno
#> [1] 1 2 3 4 5 6 7 8 9 10
lista1[c("uno", "dos")]
#> $uno
#> [1] 1 2 3 4 5 6 7 8 9 10
#>
#> $dos
#> [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q"
#> [18] "R" "S" "T" "U" "V" "W" "X" "Y" "Z"
Con las mismas consideraciones sobre los corchetes
class (lista1["uno"]) #corchete unico mantiene la estructura de lista
#> [1] "list"
length (lista1["uno"]) #alrededor del objeto
#> [1] 1
class (lista1[["uno"]]) #corchete doble extrae el objeto de la posicion
#> [1] "integer"
length (lista1[["uno"]]) #en su propio formato
#> [1] 10
Cuando las listas tiene nombres se puede ademas utilizar la notacion $ que es equivalente a la del doble corchete
lista1$uno
#> [1] 1 2 3 4 5 6 7 8 9 10
class (lista1$uno)
#> [1] "integer"
length (lista1$uno)
#> [1] 10
Loops generales
for (i in lista1) {
print (class (i))
}
#> [1] "integer"
#> [1] "character"
#> [1] "matrix"
Loops especificos para listas. Son mas elegante y eficiente en R
sapply (lista1, class)
#> uno dos tres
#> "integer" "character" "matrix"
lapply (lista1, class)
#> $uno
#> [1] "integer"
#>
#> $dos
#> [1] "character"
#>
#> $tres
#> [1] "matrix"
sapply (lista1, length)
#> uno dos tres
#> 10 26 20
lapply (lista1, length)
#> $uno
#> [1] 10
#>
#> $dos
#> [1] 26
#>
#> $tres
#> [1] 20
sapply (lista1, dim)
#> $uno
#> NULL
#>
#> $dos
#> NULL
#>
#> $tres
#> [1] 10 2
lapply (lista1, dim)
#> $uno
#> NULL
#>
#> $dos
#> NULL
#>
#> $tres
#> [1] 10 2