Julio, 2018. fdsalgado@uazuay.edu.ec

¿Qué son?

En esta lección, cubriremos matrices y data frames.

Ambos representan tipos de datos "rectangulares", lo que significa que se usan para almacenar datos tabulares, con filas y columnas.

La principal diferencia, es que las matrices solo pueden contener una única clase de datos (al igual que los vectores), mientras que los data frames pueden consistir en muchas clases diferentes de datos.

Matrices

mi_vector <- 1:20
mi_vector
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
dim(mi_vector)
## NULL

Claramente,eso no fue muy útil. Como la variable es un vector, no tiene un atributo "dim"" (entonces es simplemente NULL).

Matrices

¿Qué ocurre si le damos a mi_vector un atributo "dim"?

dim(mi_vector) <- c(4, 5)
mi_vector
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    5    9   13   17
## [2,]    2    6   10   14   18
## [3,]    3    7   11   15   19
## [4,]    4    8   12   16   20
class(mi_vector)
## [1] "matrix"

Matrices

El ejemplo que utilizamos hasta ahora tenía la intención de ilustrar el punto de que una matriz es simplemente un vector atómico con un atributo de dimensión.

mi_matriz <- mi_vector

Un método más directo para crear la misma matriz utiliza la función matrix ().

mi_matriz2 <- matrix(1:20, 4, 5)
identical(mi_matriz, mi_matriz2)
## [1] TRUE

Matrices

arboles <- c("Tipuana tipu", "Myrsine andina", "Salix humboldtiana", "Ceiba pubiflora")
cbind(arboles, mi_matriz) # column bind o juntar por columna.
##      arboles                                    
## [1,] "Tipuana tipu"       "1" "5" "9"  "13" "17"
## [2,] "Myrsine andina"     "2" "6" "10" "14" "18"
## [3,] "Salix humboldtiana" "3" "7" "11" "15" "19"
## [4,] "Ceiba pubiflora"    "4" "8" "12" "16" "20"

Esto se llama "coerción implícita" porque no lo hemos pedido. Solo sucedió.

¡Todavía necesito trabajar con datos de diferentes clases!

Data Frames

mi_data <- data.frame(arboles,mi_matriz) # se crea un df
mi_data
##              arboles X1 X2 X3 X4 X5
## 1       Tipuana tipu  1  5  9 13 17
## 2     Myrsine andina  2  6 10 14 18
## 3 Salix humboldtiana  3  7 11 15 19
## 4    Ceiba pubiflora  4  8 12 16 20
class(mi_data)
## [1] "data.frame"

Data Frames

cnombres <- c("nombre_científico", "dap", "circunferencia", "diametro_copa", "edad", "altura" )
colnames(mi_data) <- cnombres
mi_data
##    nombre_científico dap circunferencia diametro_copa edad altura
## 1       Tipuana tipu   1              5             9   13     17
## 2     Myrsine andina   2              6            10   14     18
## 3 Salix humboldtiana   3              7            11   15     19
## 4    Ceiba pubiflora   4              8            12   16     20

Conjunto de datos en R

Varios conjuntos de datos tabulados o data sets se icluyen en la instalación de R (en el paquete "datasets") y por defecto se ecuentran cargados para su uso. la funcion data() lista todos los data sets de R.

Trabajemos con el data set "iris" (Edgar Anderson's Iris Data)

str(iris)
## 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

Data Frames

iris[, "Species"] # todas las obs de la var. 'Species'
##   [1] setosa     setosa     setosa     setosa     setosa     setosa    
##   [7] setosa     setosa     setosa     setosa     setosa     setosa    
##  [13] setosa     setosa     setosa     setosa     setosa     setosa    
##  [19] setosa     setosa     setosa     setosa     setosa     setosa    
##  [25] setosa     setosa     setosa     setosa     setosa     setosa    
##  [31] setosa     setosa     setosa     setosa     setosa     setosa    
##  [37] setosa     setosa     setosa     setosa     setosa     setosa    
##  [43] setosa     setosa     setosa     setosa     setosa     setosa    
##  [49] setosa     setosa     versicolor versicolor versicolor versicolor
##  [55] versicolor versicolor versicolor versicolor versicolor versicolor
##  [61] versicolor versicolor versicolor versicolor versicolor versicolor
##  [67] versicolor versicolor versicolor versicolor versicolor versicolor
##  [73] versicolor versicolor versicolor versicolor versicolor versicolor
##  [79] versicolor versicolor versicolor versicolor versicolor versicolor
##  [85] versicolor versicolor versicolor versicolor versicolor versicolor
##  [91] versicolor versicolor versicolor versicolor versicolor versicolor
##  [97] versicolor versicolor versicolor versicolor virginica  virginica 
## [103] virginica  virginica  virginica  virginica  virginica  virginica 
## [109] virginica  virginica  virginica  virginica  virginica  virginica 
## [115] virginica  virginica  virginica  virginica  virginica  virginica 
## [121] virginica  virginica  virginica  virginica  virginica  virginica 
## [127] virginica  virginica  virginica  virginica  virginica  virginica 
## [133] virginica  virginica  virginica  virginica  virginica  virginica 
## [139] virginica  virginica  virginica  virginica  virginica  virginica 
## [145] virginica  virginica  virginica  virginica  virginica  virginica 
## Levels: setosa versicolor virginica

Data Frames

Se utiliza el caracter '$' para acceder a los campos o columnas.

iris$Species      # Lo mismo. 
##   [1] setosa     setosa     setosa     setosa     setosa     setosa    
##   [7] setosa     setosa     setosa     setosa     setosa     setosa    
##  [13] setosa     setosa     setosa     setosa     setosa     setosa    
##  [19] setosa     setosa     setosa     setosa     setosa     setosa    
##  [25] setosa     setosa     setosa     setosa     setosa     setosa    
##  [31] setosa     setosa     setosa     setosa     setosa     setosa    
##  [37] setosa     setosa     setosa     setosa     setosa     setosa    
##  [43] setosa     setosa     setosa     setosa     setosa     setosa    
##  [49] setosa     setosa     versicolor versicolor versicolor versicolor
##  [55] versicolor versicolor versicolor versicolor versicolor versicolor
##  [61] versicolor versicolor versicolor versicolor versicolor versicolor
##  [67] versicolor versicolor versicolor versicolor versicolor versicolor
##  [73] versicolor versicolor versicolor versicolor versicolor versicolor
##  [79] versicolor versicolor versicolor versicolor versicolor versicolor
##  [85] versicolor versicolor versicolor versicolor versicolor versicolor
##  [91] versicolor versicolor versicolor versicolor versicolor versicolor
##  [97] versicolor versicolor versicolor versicolor virginica  virginica 
## [103] virginica  virginica  virginica  virginica  virginica  virginica 
## [109] virginica  virginica  virginica  virginica  virginica  virginica 
## [115] virginica  virginica  virginica  virginica  virginica  virginica 
## [121] virginica  virginica  virginica  virginica  virginica  virginica 
## [127] virginica  virginica  virginica  virginica  virginica  virginica 
## [133] virginica  virginica  virginica  virginica  virginica  virginica 
## [139] virginica  virginica  virginica  virginica  virginica  virginica 
## [145] virginica  virginica  virginica  virginica  virginica  virginica 
## Levels: setosa versicolor virginica

Data Frames

Cuando queremos extraer según una condicion. Esto se complica.

#iris[iris[,"Species"]=="setosa", ]
iris[iris$Species=="setosa", ] 
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1           5.1         3.5          1.4         0.2  setosa
## 2           4.9         3.0          1.4         0.2  setosa
## 3           4.7         3.2          1.3         0.2  setosa
## 4           4.6         3.1          1.5         0.2  setosa
## 5           5.0         3.6          1.4         0.2  setosa
## 6           5.4         3.9          1.7         0.4  setosa
## 7           4.6         3.4          1.4         0.3  setosa
## 8           5.0         3.4          1.5         0.2  setosa
## 9           4.4         2.9          1.4         0.2  setosa
## 10          4.9         3.1          1.5         0.1  setosa
## 11          5.4         3.7          1.5         0.2  setosa
## 12          4.8         3.4          1.6         0.2  setosa
## 13          4.8         3.0          1.4         0.1  setosa
## 14          4.3         3.0          1.1         0.1  setosa
## 15          5.8         4.0          1.2         0.2  setosa
## 16          5.7         4.4          1.5         0.4  setosa
## 17          5.4         3.9          1.3         0.4  setosa
## 18          5.1         3.5          1.4         0.3  setosa
## 19          5.7         3.8          1.7         0.3  setosa
## 20          5.1         3.8          1.5         0.3  setosa
## 21          5.4         3.4          1.7         0.2  setosa
## 22          5.1         3.7          1.5         0.4  setosa
## 23          4.6         3.6          1.0         0.2  setosa
## 24          5.1         3.3          1.7         0.5  setosa
## 25          4.8         3.4          1.9         0.2  setosa
## 26          5.0         3.0          1.6         0.2  setosa
## 27          5.0         3.4          1.6         0.4  setosa
## 28          5.2         3.5          1.5         0.2  setosa
## 29          5.2         3.4          1.4         0.2  setosa
## 30          4.7         3.2          1.6         0.2  setosa
## 31          4.8         3.1          1.6         0.2  setosa
## 32          5.4         3.4          1.5         0.4  setosa
## 33          5.2         4.1          1.5         0.1  setosa
## 34          5.5         4.2          1.4         0.2  setosa
## 35          4.9         3.1          1.5         0.2  setosa
## 36          5.0         3.2          1.2         0.2  setosa
## 37          5.5         3.5          1.3         0.2  setosa
## 38          4.9         3.6          1.4         0.1  setosa
## 39          4.4         3.0          1.3         0.2  setosa
## 40          5.1         3.4          1.5         0.2  setosa
## 41          5.0         3.5          1.3         0.3  setosa
## 42          4.5         2.3          1.3         0.3  setosa
## 43          4.4         3.2          1.3         0.2  setosa
## 44          5.0         3.5          1.6         0.6  setosa
## 45          5.1         3.8          1.9         0.4  setosa
## 46          4.8         3.0          1.4         0.3  setosa
## 47          5.1         3.8          1.6         0.2  setosa
## 48          4.6         3.2          1.4         0.2  setosa
## 49          5.3         3.7          1.5         0.2  setosa
## 50          5.0         3.3          1.4         0.2  setosa

Data Frames

Y aún más… Queremos obtener las obs. donde el ancho del sépalo sea menor a 3 y la especie sea "setosa".

iris[iris[,"Sepal.Width"]<=3 & iris[,"Species"]=="setosa", ]
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 2           4.9         3.0          1.4         0.2  setosa
## 9           4.4         2.9          1.4         0.2  setosa
## 13          4.8         3.0          1.4         0.1  setosa
## 14          4.3         3.0          1.1         0.1  setosa
## 26          5.0         3.0          1.6         0.2  setosa
## 39          4.4         3.0          1.3         0.2  setosa
## 42          4.5         2.3          1.3         0.3  setosa
## 46          4.8         3.0          1.4         0.3  setosa

Subsetting

La función subset nos facilita el recuperar datos cuando queremos que se cumplan ciertas condiciones.

subset(iris, Sepal.Width <= 3  & Species == "setosa")
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 2           4.9         3.0          1.4         0.2  setosa
## 9           4.4         2.9          1.4         0.2  setosa
## 13          4.8         3.0          1.4         0.1  setosa
## 14          4.3         3.0          1.1         0.1  setosa
## 26          5.0         3.0          1.6         0.2  setosa
## 39          4.4         3.0          1.3         0.2  setosa
## 42          4.5         2.3          1.3         0.3  setosa
## 46          4.8         3.0          1.4         0.3  setosa

¿Pero es la mejor opción?

  • ¿Cómo ordeno?
  • ¿Cómo cambio deun formato "ancho" a un formato "largo" (o viceversa)?
  • etc., etc.

La tendencia en la comunidad R para el tratamiento de datos, comprende el uso de tidyverse.

Manipulación de datos

A menudo se dice que el 80% del análisis de datos se gasta en el proceso de limpieza y preparación de los datos. (Dasu y Johnson, 2003)

Los datos bien estructurados tienen dos propósitos:

  • Hace que los datos sean adecuados para el procesamiento del software, ya sean funciones matemáticas, visualización, etc.
  • Revela información y nuevas perspectivas.

El artículo de Hadley Wickham sobre Tidy Data proporciona una acertada explicación detrás del concepto de datos ordenados o "tidy data"

Introducción a tidyverse: dplyr

El paquete dplyr de R es parte del framework tidyverse de R. Este contiene un conjunto de herramientas (funciones) sumamente intuitivas y poderosas para una rápida y fácil manipulación y procesamiento de los datos. Las posibilidades de dplyr son muy extensas, pero abordaremos las más importantes aquí.

library(readr)  # Se cargan los paquetes o librerías de tidyverse.
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union

Introducción a tidyverse: dplyr

A manera de ejemplo, guardamos el dataset de iris a un archivo csv y lo cargamos nuevamente en una nueva variable.

write_csv(iris, "iris.csv")
mi_iris<- read_csv("iris.csv")
## Parsed with column specification:
## cols(
##   Sepal.Length = col_double(),
##   Sepal.Width = col_double(),
##   Petal.Length = col_double(),
##   Petal.Width = col_double(),
##   Species = col_character()
## )

Introducción a tidyverse

head(mi_iris)
## # A tibble: 6 x 5
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
##          <dbl>       <dbl>        <dbl>       <dbl> <chr>  
## 1          5.1         3.5          1.4         0.2 setosa 
## 2          4.9         3            1.4         0.2 setosa 
## 3          4.7         3.2          1.3         0.2 setosa 
## 4          4.6         3.1          1.5         0.2 setosa 
## 5          5           3.6          1.4         0.2 setosa 
## 6          5.4         3.9          1.7         0.4 setosa

La nueva estructura es un tibble. Los Tibbles son una versión moderna de los Data Frame.