2 Tipos y estructuras de datos en R

R es capaz de manejar una variedad de tipos de datos, que se almacenan en diferentes estructuras de datos como se puede observar en la tabla 2.1:

Table 2.1: Tipos de datos básicos de R
Tipo de dato Descripción Definición
Numeric Números decimales numero <- 1.0
Integer Números enteros int <- 1
Character Cadenas de texto str <- "un texto"
Complex Números complejos comp <- 3+2i
Logical Verdadero (TRUE) o falso (FALSE). Es a menudo el resultado de operaciones lógicas. a <- 1; b <- 2; a < b
Factor Este no es estrictamente un tipo de dato, pero vale la pena describirlo aquí. Una variable factor es una variable categórica. Los vectores de caracteres a menudo se almacenan como factores para explotar funciones para tratar datos categóricos. Por ejemplo, en análisis de regresión. Aplique as.factor() a un vector de caracteres.

2.1 Vectores

  • Elemento más básico en R.
  • Contiene elementos de la misma clase (son atómicos).
  • Se crea con la función c(), que significa ‘concatenar’ o ‘combinar’.
## [1]  1.10 10.00  3.14
## [1]   1.10  10.00   3.14 555.00   1.10  10.00   3.14

2.1.1 Algunas operaciones con vectores

## [1] 10
## [1] TRUE
## [1] TRUE

Otras operaciones:

## [1] 102.20 120.00 106.28
## [1] 0.3162278 3.0000000 1.4628739
## [1] 3.478505 3.333333 2.146460

Cuando indicamos a R que calcule v * 2 + 100, lo que realmente calcula es esto:

## [1] 102.20 120.00 106.28

A esto se lo conoce como “reciclaje” de vector.

Reciclaje de elementos:

## [1]  1 12  3 14
## Warning in c(1, 2, 3, 4) + c(0, 10, 100): longer object length is not a
## multiple of shorter object length
## [1]   1  12 103   4

Crear vectores adicionales:

## [1] "1"    "2"    "esto"

Tenga en cuenta que al crear d, los números se convierten en caracteres automáticamente porque un vector no puede tener tipos mixtos.

Se puede acceder a los elementos de un vector, manipularlos y cambiarlos:

## [1] 6
## [1] 16
## [1]  2  4  6  8 10 12

2.2 Secuencias numéricas

##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
## [1] 3.141593 4.141593 5.141593 6.141593 7.141593 8.141593 9.141593
##  [1] 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1

x:y puede leerse como “secuencia de x a(:) y.”

##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
##  [1]  0.0  0.5  1.0  1.5  2.0  2.5  3.0  3.5  4.0  4.5  5.0  5.5  6.0  6.5
## [15]  7.0  7.5  8.0  8.5  9.0  9.5 10.0
##  [1]  5.000000  5.263158  5.526316  5.789474  6.052632  6.315789  6.578947
##  [8]  6.842105  7.105263  7.368421  7.631579  7.894737  8.157895  8.421053
## [15]  8.684211  8.947368  9.210526  9.473684  9.736842 10.000000

2.3 Listas

A diferencia de un vector, una lista es una colección de elementos que pueden ser de diferente tipo. Los componentes de una lista son típicamente pares clave-valor. El siguiente ejemplo muestra cómo se puede almacenar un punto (con coordenas) en una lista.

## [1] 123
## NULL
## NULL
## $id
## [1] 123
## [1] "list"
## [1] "numeric"
## [1] 246

La lista en el ejemplo tiene tres elementos de diferentes tipos de datos. id es numérico, coordenadas son otra lista y spatial.reference es una cadena de caracteres. La lista coordenadas contiene dos elementos numéricos, X e Y. Generalmente, se accede a los elementos de la lista usando su nombre, en lugar de número. En particular, muchas estructuras de datos tienen elementos con nombre a los que se puede acceder utilizando los operadores $ o @.

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.

2.4 Matrices

Una matriz es una estructura bidimensional. Las filas son horizontales y las columnas son verticales. Una matriz de 4 por 3 (4 x 3), por ejemplo, tiene 4 filas y 3 columnas. Las matrices se crean comúnmente usando tablas de datos numéricos como las de una hoja de cálculo de Excel o un archivo csv.

##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
## NULL

Dado que la variable es un vector, no tiene un atributo dim (entonces es simplemente NULL).

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

##      [,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
## [1] "matrix"

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

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

## [1] TRUE
##      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ó.

Sin embargo, todavía se desea trabajar con diferentes tipos de datos.

2.5 Data Frames

Un data frame es una estructura de datos bidimensional similar a una matriz, pero funciona de manera muy diferente. Si bien un data frame parece una tabla simple, de hecho es una lista de vectores de la misma longitud. Para los nuevos usuarios de R, las matrices y los data frames parecen similares. La principal diferencia es que un data frame permite tipos de datos mixtos (por ejemplo, numérico, lógico, caracter). Esto les permite almacenar diferentes tipos de variables, lo cual es muy útil en el análisis estadístico. Por ejemplo, en un análisis de regresión. Las matrices se usan principalmente para almacenar datos numéricos, y se pueden usar para álgebra matricial.

##              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
## [1] "data.frame"
##    nombre_cientifico 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

2.5.1 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)

## '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 ...

iris es otro data frame:

##   [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

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

##   [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

Cuando queremos extraer datos del data frame según una condicion, esto se complica.

##    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

Así mismo, si se desea obtener las observaciones donde el ancho del sépalo sea menor a 3 y la especie sea “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

2.5.2 Subsetting

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

##    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 de un formato “ancho” a un formato “largo” (o viceversa)?
  • etc.

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

2.6 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

2.7 Introducción a tidyverse: dplyr

El paquete dplyr de R es parte del marco de trabajo 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.

## 
## 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

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

## Parsed with column specification:
## cols(
##   Sepal.Length = col_double(),
##   Sepal.Width = col_double(),
##   Petal.Length = col_double(),
##   Petal.Width = col_double(),
##   Species = col_character()
## )
## # 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.

2.8 Valores no disponibles

Los valores no disponibles o faltantes juegan un papel importante en las estadísticas y el análisis de datos.

A menudo, los valores faltantes no deben ignorarse, sino que deben estudiarse cuidadosamente para determinar si hay un patrón subyacente o causa de su desaparición.

En R, NA se usa para representar cualquier valor que “no está disponible (Not Available)” o “falte” (en el sentido estadístico).

Un segundo tipo de valor no disponible: NaN, que significa “no es un número (Not a Number)”.

## [1] NaN
## [1] Inf
## [1] NaN

2.8.1 Probando valores no disponibles

## [1] FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE  TRUE FALSE
## [1] 3

2.8.2 Excluir valores no disponibles de los análisis

## [1] NA
## [1] 2
  • La función complete.cases(nombre_variable) devuelve un vector lógico que indica qué casos están completos.
  • La función na.omit() devuelve el objeto con eliminación en lista de valores faltantes.
## [1] 1 2 3 5 6 9
## attr(,"na.action")
## [1] 4 7 8
## attr(,"class")
## [1] "omit"