Sesión 4. Repaso y Refuerzo.

En esta sesión vamos a dar un refuerzo a algunos temas que valen la pena repasarse.

1. Naturaleza del NA.

El NA es la forma que toman los valores inexistentes dentro de una base de datos.

NA es el acrónimo en R para No disponible.

¿Por qué surgen los NA?

Hay varios motivos para que surgan NAs. Entre los más comunes se encuentran los siguientes:

1. Surgen como resultado de una mala aplicación de una función.

Ejemplo:

# Ejemplo 1. Cuando queremos transformar un vector de un tipo a otro. 
library(tidyverse)
## ── Attaching packages ────────────────────────────── tidyverse 1.2.1 ──
## ✔ ggplot2 3.2.0     ✔ purrr   0.3.2
## ✔ tibble  2.1.3     ✔ dplyr   0.8.2
## ✔ tidyr   0.8.3     ✔ stringr 1.4.0
## ✔ readr   1.3.1     ✔ forcats 0.4.0
## ── Conflicts ───────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
# Creamos un vector de texto
vec <- c("1", "Rabanos", "Cebollas", "Cilantro")
# Lo convertimos a numerico (NO TIENE SENTIDO!)
vec2 <- vec %>% as.numeric()
## Warning in function_list[[k]](value): NAs introduced by coercion
vec2
## [1]  1 NA NA NA
# Ejemplo 2. Cuando declaramos los niveles de un factor de manera incompleta 

# Generamos un vector de texto
texto <- c("arriba", "abajo", "de un lado", "para el otro", "arriba", "arriba", "abajo")

# Convertimos a factor el vector de texto
categorico <- factor(texto, 
                     ordered = TRUE, 
                     levels = c("arriba", "abajo", "de un lado")
                     )

# Imprimimos el vector categorico
print(categorico)
## [1] arriba     abajo      de un lado <NA>       arriba     arriba    
## [7] abajo     
## Levels: arriba < abajo < de un lado
# Como podemos ver, 

Como podemos ver arriba, el elemento 4 del vector es un valor NA. Esto es por que a la hora de ordenar las categorías del factor la observación para el otro quedó fuera de las categorías declaradas.

Es por eso que siempre hay que fijarse en que le damos todas las categorías al vector categórico.

2. El que elaboró la base de datos no pudo registrar el dato correspondiente.

En la siguiente imagen, vemos una base de datos que tiene celdas vacías. Si la importamos en R, todas esas celdas se van a importar como NAs.

! Alt text

# Leemos la base de datos
bd <- readxl::read_xlsx("01 Datos/DesgloseAguasResiduales.xlsx", skip = 1)

# Imprimimos la base de datos. 
bd
## # A tibble: 33 x 9
##     year ent   cve_ent no    Aerobio Anaerobio `Filtros Biológ…
##    <dbl> <chr> <chr>   <chr>   <dbl>     <dbl>            <dbl>
##  1  2015 Agua… 01      NA       NA        12                NA 
##  2  2015 Baja… 02      NA       NA        NA               155.
##  3  2015 Baja… 03      NA        7.3      NA                NA 
##  4  2015 Camp… 04      NA       NA        NA                10 
##  5  2015 Coah… 05      NA       NA        NA                NA 
##  6  2015 Coli… 06      NA       NA        NA                NA 
##  7  2015 Chia… 07      NA        3.5       4.1             328.
##  8  2015 Chih… 08      NA       28         0.5              NA 
##  9  2015 Ciud… 09      NA       NA        NA                NA 
## 10  2015 Dura… 10      NA       NA         0.2              NA 
## # … with 23 more rows, and 2 more variables: `Lagunas de
## #   estabilización` <dbl>, `Lodos Activados` <dbl>

3. En caso de encuestas, el entrevistado se negó a responder una pregunta dada, y el entrevistador tuvo que rellenar con un dato No Disponible.

Pregunta. Si un entrevistador te pregunta cuanto ganas al mes… ¿qué le contestas?

Hay que tener cuidado con estos NAs, porque incluso el silencio puede decirnos algo. (Imagina que pregunta )

¿Qué hacemos con los NAs?

Tenemos 3 opciones:

1. Los ignoramos.

# Sumamos los elementos del siguiente vector. 
vec1 <- c(1:100, NA, NA)
sum(vec1)
## [1] NA
# Nos da NA Para que no nos de NA, utilizamos el argumento na.rm para que ignore los NAs del vector.
sum(vec1, na.rm = TRUE)
## [1] 5050

2. Los eliminamos.

# Si queremos eliminar los NAs en un vector, utilizamos la funcion na.omit()
vector_sin_NAs <- vec1 %>% na.omit()
vector_sin_NAs <- na.omit(vec1)

# Imprimimos el vector de NAs
vector_sin_NAs
##   [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17
##  [18]  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34
##  [35]  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51
##  [52]  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68
##  [69]  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85
##  [86]  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100
## attr(,"na.action")
## [1] 101 102
## attr(,"class")
## [1] "omit"

3. Los rellenamos.

# Vamos a rellenar los NAs con un cero. 
is.na(vec1) # Me da un vector logico
##   [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [34] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [45] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [56] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [67] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [78] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [89] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [100] FALSE  TRUE  TRUE
vec1 %>% is.na()
##   [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [34] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [45] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [56] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [67] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [78] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [89] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [100] FALSE  TRUE  TRUE
vec1[is.na(vec1)] <- 0 # Esto sustituye los NAs con ceros. 
# Esto es R antiguo. En clase veremos como hacerlo de manera moderna. 

# Imprimimos el vec1 con NAs reemplazados. 
vec1
##   [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17
##  [18]  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34
##  [35]  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51
##  [52]  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68
##  [69]  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85
##  [86]  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100   0   0
# Vemos que ya no tenemos NAs. 

2. Suma de logicals, suma de factores.

Cambio de tema. Ahora, veremos si se pueden sumar vectores de clase logical y categóricos factors.

# Supongamos el siguiente vector logico 
veclog <- c(T, T, TRUE, FALSE, F)

# Ahora lo sumamos. Que paso? 
sum(veclog)
## [1] 3

La suma de un vector logico funciona porque por debajo, R interpreta los vectores logicos como un vector de ceros y unos.

Entonces… se puede hacer lo mismo con los vectores factores, que tienen numeros por debajo? Veamos.

categorico
## [1] arriba     abajo      de un lado <NA>       arriba     arriba    
## [7] abajo     
## Levels: arriba < abajo < de un lado
# sum(categorico) # No lo corro porque da el error siguiente: 

# Error in Summary.ordered(c(1L, 2L, 3L, NA, 1L, 1L, 2L), na.rm = FALSE) : 'sum' not defined for ordered factors

Nos da Error. Esto pasa porque lo que tiene por debajo no son numeros, sino texto.

Lección! Si se pueden sumar variables lógicas, pero no se pueden sumar variables categóricas del tipo factor.

3. Leer otros tipos de archivos.

Bases de datos geográficas

Las bases de datos geográficas son bases que almacenan información relacionada con puntos, lineas o lugares en el espacio. Estos datos se almacenan, típicamente, en archivos del tipo *.geojson o *.shp.

En esta ocasión, vamos a leer un archivo .geojson. Primero descargamos la libreria sf.

# Si no lo tienes instalado, instala esta libreria con el siguiente comando: 
install.packages("sf")
## Nota: Tienes que tener la 'ultima version de R disponible. Si tienes problemas al descargar esta libreria, mandame mensaje. 

Una vez instalada, llamamos el siguiente código.

# Llamamos a la libreria: 
library(sf)
## Linking to GEOS 3.6.1, GDAL 2.1.3, PROJ 4.9.3
# Guardamos la base de datos siguiente, CUYA UBICACION EXACTA LA VIMOS EN GITHUB EN EL LABORATORIO, en un objeto llamado "obj". 

obj <- st_read("https://raw.githubusercontent.com/JuveCampos/MexicoSinIslas/master/Sin_islas_simplificado.geojson")
## Reading layer `OGRGeoJSON' from data source `https://raw.githubusercontent.com/JuveCampos/MexicoSinIslas/master/Sin_islas_simplificado.geojson' using driver `GeoJSON'
## Simple feature collection with 32 features and 7 fields
## geometry type:  MULTIPOLYGON
## dimension:      XY
## bbox:           xmin: -117.1244 ymin: 14.53508 xmax: -86.74038 ymax: 32.71629
## epsg (SRID):    4326
## proj4string:    +proj=longlat +datum=WGS84 +no_defs
# Vemos que clase es el objeto "obj". 
class(obj) # El objeto es del tipo sf, el cual es el tipico para guardar bases de datos. 
## [1] "sf"         "data.frame"
# Visualizamos que efectivamente tenemos una base de datos geografica: 

# Este codigo solo me plotea (grafica) el mapa para la primera variable de la base de datos. 
plot(obj, max.plot = 1)

# Este codigo me plotea el mapa para las primeras 8 variables de las bases de datos. 
plot(obj)

Advertencia!

Si no le pones el argumento max.plot = 1, y tu base de datos es muy grande (por ejemplo, de los 2,000 municipios), tu sesión de RStudio va a crashear (se va a trabar, va a dejar de funcionar). Y vas a tener que reiniciar el programa.

4. Ejercicio Práctico.

Este queda pendiente para la siguiente clase 😉.