Introduccion a R: listas

David Montaner (2014-03-31)

Script que introduce los comandos mas basicos de R relacionados con listas.


# rm (list = ls ())

LISTAS

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 sobre listas

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