Capítulo 8 Soluciones a problemas

Todos los problemas en programación tienen más de una forma de llegar a ellos, es por esto que las soluciones acá mostradas deben tomarse solo como una referencia, y revisar si el resultado final de tu código (aunque sea distinto de este), sea igual al que presentamos.

8.1 Capítulo 1

8.1.1 Ejercicio 1

Algunas posibles soluciones:

storms %>% filter(status == "hurricane") %>% select(year, wind, 
    hu_diameter) %>% group_by(year) %>% summarize_all(mean)
storms %>% filter(status == "hurricane" & !is.na(hu_diameter)) %>% 
    select(year, wind, hu_diameter) %>% group_by(year) %>% summarize_all(mean)
storms %>% filter(status == "hurricane") %>% select(year, wind, 
    hu_diameter) %>% group_by(year) %>% summarize_all(funs(mean), 
    na.rm = TRUE)

8.1.2 Ejercicio 2

Una de las soluciones posibles:

Solution <- mpg %>% filter(year > 2004 & class == "compact") %>% 
    mutate(kpl = (cty * 1.609)/3.78541)

8.2 Capítulo 2

8.2.1 Ejercicio 1

Una posible solución a este problema sería:

`r mean((iris %>% filter(Species == "virginica"))$Petal.Length)`

8.3 Capítulo 3

8.3.1 Ejercicio 1

8.3.1.1 a

Sola <- Huemul %>% dplyr::select(lon, lat, basisOfRecord) %>% 
    filter(!is.na(lat) & !is.na(lon))
lon lat basisOfRecord
-72.97587 -51.18353 HUMAN_OBSERVATION
-72.93940 -49.37483 HUMAN_OBSERVATION
-72.97712 -51.01511 HUMAN_OBSERVATION
-71.87026 -46.08686 HUMAN_OBSERVATION
-72.43751 -47.20485 HUMAN_OBSERVATION
-73.01456 -51.03635 HUMAN_OBSERVATION
-73.03190 -51.17531 HUMAN_OBSERVATION
-72.72944 -46.25602 HUMAN_OBSERVATION
-71.31538 -41.30110 PRESERVED_SPECIMEN
-71.31538 -41.30110 PRESERVED_SPECIMEN
-71.71667 -44.86667 PRESERVED_SPECIMEN
-71.71667 -44.86667 PRESERVED_SPECIMEN
-71.30989 -40.81978 PRESERVED_SPECIMEN
-71.31538 -41.30110 PRESERVED_SPECIMEN
-73.02467 -50.46476 PRESERVED_SPECIMEN
-71.33186 -41.26523 PRESERVED_SPECIMEN
-73.01764 -50.46747 PRESERVED_SPECIMEN
-71.70000 -45.26667 PRESERVED_SPECIMEN
-71.70000 -45.26667 PRESERVED_SPECIMEN
-71.70000 -45.26667 PRESERVED_SPECIMEN
-72.08000 -47.25000 PRESERVED_SPECIMEN
-72.00000 -41.50000 PRESERVED_SPECIMEN
-71.36714 -41.13574 PRESERVED_SPECIMEN
-71.71094 -42.75692 HUMAN_OBSERVATION
-71.64718 -40.22605 PRESERVED_SPECIMEN
-67.88534 -43.99376 PRESERVED_SPECIMEN

8.3.1.2 b

Solb <- Huemul %>% group_by(basisOfRecord) %>% summarize(N = n())
basisOfRecord N
HUMAN_OBSERVATION 103
PRESERVED_SPECIMEN 65

8.3.2 Ejercicio 2

8.3.2.1 a

Primero bajamos la base de datos, lo cual se puede hacer de forma manual o como en el código siguiente utilizando la función download.file

download.file("http://www.ine.cl/docs/default-source/medioambiente-(micrositio)/variables-b%C3%A1sicas-ambientales-(vba)/aire/dimensi%C3%B3n-aire-factor-estado.xlsx?sfvrsn=4", 
    destfile = "test.xlsx")

Una vez bajada esta base de datos utilizaremos los paquetes readxl para leer los archivos excel, tidyverse para manipular los datos y stringr para trabajar con texto.

library(readxl)
library(tidyverse)
library(stringr)

Partimos leyendo la pestaña que contiene las estaciones meteorológicas con su código:

EM <- read_excel("test.xlsx", sheet = "T001")

Luego para poder más adelante unir esta base de datos con otras, cambiamos el nombre de la columna Codigo_Est_Meteoro a Est_Meteoro como aparece en las otras bases de datos.

EM <- EM %>% rename(Est_Meteoro = Codigo_Est_Meteoro)

Luego empezamos a trabajar con la base de datos de temperatura media, para esto leemos la pestaña E10000003

TempMedia <- read_excel("test.xlsx", sheet = "E10000003")

Existen varias variables que no utilizaremos, por ejemplo el código de la variable, y la unidad de medida. Además vemos que la variable día, siempre tiene valor 0, por lo cuál podemos eliminarla también.

TempMedia <- TempMedia %>% select(-Codigo_variable, -Unidad_medida, 
    -Día)

Además podemos cambiar los nombres de la columna ValorF que no tiene ningún significado a TempMedia y Año a Year, esta última variable es cambiada solo por que la letra Ñ puede no ser leída por todos los computadores.

TempMedia <- TempMedia %>% rename(TempMedia = ValorF, Year = Año)

Si nos fijamos, hay algunos años, en los cuales todos los meses aparecen como 13, esto nos indica que en estos años no se registró en que mes se realizó la medición, por lo cual se eliminarán esas obsevaciones.

TempMedia <- TempMedia %>% filter(Mes != 13)

Posterior a esto, unumos la base de datos TempMedia con la base de datos EM y seleccionamos tan solo las columnas que nos interesan y finalmente transformamos el mes en una variable numérica:

## Joining, by = "Est_Meteoro"
TempMedia <- left_join(TempMedia, EM) %>% select(Mes, Year, TempMedia, 
    Ciudad_localidad) %>% mutate(Mes = as.numeric(Mes))

Si hicieramos todo esto en un comando tendriamos el siguiente código

TempMedia <- read_excel("test.xlsx", sheet = "E10000003") %>% 
    select(-Codigo_variable, -Unidad_medida, -Día) %>% rename(TempMedia = ValorF, 
    Year = Año) %>% filter(Mes != 13) %>% left_join(EM) %>% 
    select(Mes, Year, TempMedia, Ciudad_localidad) %>% mutate(Mes = as.numeric(Mes))

De la misma manera modificamos el código de arriba para la humedad con la salvedad que la columna de día no tiene tilde en esta pestaña a la fecha de 19 de Agosto del 2018:

## Joining, by = "Est_Meteoro"
HumMedia <- read_excel("test.xlsx", sheet = "E10000006") %>% 
    dplyr::select(-Codigo_variable, -Unidad_medida, -Dia) %>% 
    rename(HumMedia = ValorF, Year = Año) %>% filter(Mes != 
    13) %>% left_join(EM) %>% dplyr::select(Mes, Year, HumMedia, 
    Ciudad_localidad) %>% mutate(Mes = as.numeric(Mes))

En el siguiente código unimos las dos bases de datos, vemos las primeras 20 observaciones de la base de datos resultante en la tabla 8.1

TempHum <- full_join(TempMedia, HumMedia)
## Joining, by = c("Mes", "Year", "Ciudad_localidad")
Tabla 8.1: Las primeras 20 observaciones de temperatura y humedad unidas
Mes Year TempMedia Ciudad_localidad HumMedia
1 1981 22.0 Arica NA
2 1981 22.2 Arica NA
3 1981 22.1 Arica NA
4 1981 20.3 Arica NA
5 1981 18.2 Arica NA
6 1981 17.0 Arica NA
7 1981 15.0 Arica NA
8 1981 16.0 Arica NA
9 1981 16.6 Arica NA
10 1981 15.9 Arica NA
11 1981 19.1 Arica NA
12 1981 21.1 Arica NA
1 1981 19.7 Iquique NA
2 1981 21.1 Iquique NA
3 1981 20.9 Iquique NA
4 1981 19.9 Iquique NA
5 1981 17.6 Iquique NA
6 1981 15.9 Iquique NA
7 1981 14.6 Iquique NA
8 1981 15.6 Iquique NA

Con esto vemos que la humedad media no es medida en los mismos años ni en todos los lugares que se mide la temperatura media, pero como ambas variables nos interesan por igual, la mantenemos de todas maneras con sus valores NA

8.3.2.2 b

El segundo ejercicio es mucho mas simple, donde solo tenemos que agrupar por ciudad y mes, y usar summarize_all para las funciones mean y sd como vemos en la tabla 8.2

## Warning: funs() is soft deprecated as of dplyr 0.8.0
## please use list() instead
## 
## # Before:
## funs(name = f(.)
## 
## # After: 
## list(name = ~f(.))
## This warning is displayed once per session.
TempHumMonthly <- TempHum %>% select(-Year) %>% group_by(Mes, 
    Ciudad_localidad) %>% summarize_all(funs(mean, sd), na.rm = TRUE)
Tabla 8.2: Las primeras 20 observaciones de temperatura y humedad agrupadas por mes y localidad
Mes Ciudad_localidad TempMedia_mean HumMedia_mean TempMedia_sd HumMedia_sd
1 Antártica Chilena 1.388889 87.35000 0.6319031 3.483772
1 Antofagasta 20.125000 69.70000 0.8378118 1.589549
1 Arica 22.375000 62.72500 0.9391105 2.394960
1 Balmaceda 12.358823 56.37500 1.2200640 2.487804
1 Calama 17.000000 25.00000 NA NA
1 Cerrillos 20.996000 NaN 0.7855359 NaN
1 Chillán 19.747059 63.05000 0.7054916 3.750111
1 Concepción 16.683333 73.75000 0.6222080 6.727308
1 Copiapó 19.604348 NaN 0.7449700 NaN
1 Coyhaique 13.980556 58.27500 1.2537531 1.543535
1 Curicó 20.632353 59.65000 0.7293503 6.310573
1 Graneros 21.480000 NaN 0.4661330 NaN
1 Iquique 21.791667 61.72500 1.0332680 3.981101
1 Isla Juan Fernández 18.513889 71.22500 0.5111068 3.044531
1 La Serena 17.311429 75.97500 0.7275145 3.187868
1 Osorno 15.807407 74.10000 0.9388725 2.265686
1 Pudahuel 20.652778 47.53333 0.7268272 5.852635
1 Puerto Montt 14.451429 78.00000 0.7184016 2.499333
1 Punta Arenas 10.852778 62.55000 0.7443064 3.349129
1 Quinta Normal 21.261111 53.35000 0.5530579 6.507688