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:
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:
b <- c (2,4,6,8,10) # Crear un vector numérico
c <- c ("esto", "eso", "lo otro") # crea un vector de caracteres
d <- c (1,2, "esto") # crea un vector de tipo mixto?
d
## [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.
coordenadas=list(X=10, Y=15)
point <- list(id=123, coordenadas, spatial.reference="WGS_84")
point$id # Los elementos de la lista generalmente se acceden por nombre
## [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 <- 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ó.
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"
cnombres <- c("nombre_cientifico", "dap", "circunferencia", "diametro_copa", "edad", "altura" )
colnames(mi_data) <- cnombres
mi_data
## 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"