# 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