jueves, 16 de junio de 2016

Listas en R y qué hacer con ellas (1/2)

En R todos los datos está “vectorializados”, es decir agrupados en una estructura de vector, que en este caso es siempre una colección de elementos, incluso una colección de un solo elemento. Si todos los elementos son del mismo tipo (números enteros, cadenas de caracteres, de tipo Verdadero/Falso, etc.) se les denomina vectores atómicos. Si los elementos son de tipo heterogéneo lo que tenemos es una lista (“list”).

Creación y componentes de una lista

Para crear nuestra primera lista empezamos por crear sus componentes:

nombre <- "Juan"
edad <- 20
cursos <- c (1 : 4)
notas <- data.frame (asignaturas = c ("mates", "lengua", "idioma"), scores = c (8, 7, 9))

Nuestra primera lista, con sus cuatro componentes, sería:

miLista1 <- list (nombre, edad, cursos, notas)
miLista1
## [[1]]
## [1] "Juan"
## 
## [[2]]
## [1] 20
## 
## [[3]]
## [1] 1 2 3 4
## 
## [[4]]
##   asignaturas scores
## 1       mates      8
## 2      lengua      7
## 3      idioma      9

Una lista se puede crear también convirtiendo un vector:

as.list (cursos)
## [[1]]
## [1] 1
## 
## [[2]]
## [1] 2
## 
## [[3]]
## [1] 3
## 
## [[4]]
## [1] 4

Descripción de una lista

Para comprobar que efectivamente tenemos una lista:

is.list (miLista1)
## [1] TRUE

Lo mismo, pero ahora solicitando la clase de objeto que es:

class (miLista1)
## [1] "list"

Su número de componentes:

length (miLista1)
## [1] 4

Para comprobar de qué clase es cualquiera de los elementos, añadimos el número del elemento (su índice) entre dobles corchetes:

class (miLista1 [[4]])
## [1] "data.frame"

Para obtener una pequeña descripción de todos los elementos de la lista:

str(miLista1)
## List of 4
##  $ : chr "Juan"
##  $ : num 20
##  $ : int [1:4] 1 2 3 4
##  $ :'data.frame':    3 obs. of  2 variables:
##   ..$ asignaturas: Factor w/ 3 levels "idioma","lengua",..: 3 2 1
##   ..$ scores     : num [1:3] 8 7 9

Manejo de una lista

Nombres de los componentes

Se puede añadir un nombre a cada componente de la lista:

names (miLista1) <-  c ("alumno", "edad", "carrera", "expediente")
miLista1
## $alumno
## [1] "Juan"
## 
## $edad
## [1] 20
## 
## $carrera
## [1] 1 2 3 4
## 
## $expediente
##   asignaturas scores
## 1       mates      8
## 2      lengua      7
## 3      idioma      9

También se podían haber incorporado los nombres en el mismo momento de crear la lista:

miLista1 <- list (alumno = nombre, edad = edad, carrera = cursos, expediente = notas)

Extracción de componentes

Para acceder a componentes concretos de una lista existen varias vías, que pueden dar resultados diferentes, bien si queremos extraer un componente concreto (lo que produce una lista) o si queremos extraer el contenido de ese componente (que produce un vector, data.frame, etc., según la clase de componente que sea).

Para extraer un componente hay varios procedimientos, dando en todos los casos el mismo resultado, una lista con un solo componente:

miLista1[4]
## $expediente
##   asignaturas scores
## 1       mates      8
## 2      lengua      7
## 3      idioma      9

El mismo resultado con:

miLista1["expediente"]
## $expediente
##   asignaturas scores
## 1       mates      8
## 2      lengua      7
## 3      idioma      9

Para extraer el contenido de un componente también hay varios procedimientos, dando en todos los casos el mismo resultado de la clase que corresponda:

miLista1[[4]]
##   asignaturas scores
## 1       mates      8
## 2      lengua      7
## 3      idioma      9

El mismo resultado con:

miLista1[["expediente"]]
##   asignaturas scores
## 1       mates      8
## 2      lengua      7
## 3      idioma      9

O también con:

miLista1$expediente
##   asignaturas scores
## 1       mates      8
## 2      lengua      7
## 3      idioma      9

Podemos extraer varios componentes, dando como resultado, una lista con esos componentes:

miLista1[c(1,4)]
## $alumno
## [1] "Juan"
## 
## $expediente
##   asignaturas scores
## 1       mates      8
## 2      lengua      7
## 3      idioma      9

Extracción de segundo nivel

Para acceder a elementos dentro de uno de los componentes, por ejemplo la primera fila del componente “expediente”, la sintaxis es la siguiente:

miLista1[["expediente"]][1, ]
##   asignaturas scores
## 1       mates      8

Añadir y quitar componentes

Podemos añadir nuevos componentes a una lista con el siguiente comando:

miLista1[5] <- "Nuevo componente"
miLista1
## $alumno
## [1] "Juan"
## 
## $edad
## [1] 20
## 
## $carrera
## [1] 1 2 3 4
## 
## $expediente
##   asignaturas scores
## 1       mates      8
## 2      lengua      7
## 3      idioma      9
## 
## [[5]]
## [1] "Nuevo componente"

El nuevo componente lo hemos colocado en la posición 5. En las posiciones 1 a 4 hubiera sustituido al componente que hubiera en esa posición. Obsérvese que no hemos puesto nombre a este nuevo componente.

Para quitar un componente:

miLista1$edad <- NULL
miLista1
## $alumno
## [1] "Juan"
## 
## $carrera
## [1] 1 2 3 4
## 
## $expediente
##   asignaturas scores
## 1       mates      8
## 2      lengua      7
## 3      idioma      9
## 
## [[4]]
## [1] "Nuevo componente"

Obsérvese que al borrar un componente los siguientes avanzan una posición.

Inicializar una lista

En fin, podemos crear una lista vacía, pero especificando el número de componentes que deseamos que tenga, en este caso 3. En R se utiliza la función vector ():

nuevaLista <- vector ("list", 3)
nuevaLista
## [[1]]
## NULL
## 
## [[2]]
## NULL
## 
## [[3]]
## NULL

No hay comentarios:

Publicar un comentario