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)
8.1.2 Ejercicio 2
Una de las soluciones posibles:
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
lon | lat | basisOfRecord |
---|---|---|
-72.97728 | -51.07892 | HUMAN_OBSERVATION |
-71.87139 | -45.94562 | HUMAN_OBSERVATION |
-71.86151 | -46.17067 | HUMAN_OBSERVATION |
-71.88937 | -46.04310 | HUMAN_OBSERVATION |
-72.87022 | -51.12036 | HUMAN_OBSERVATION |
-72.00898 | -46.01153 | HUMAN_OBSERVATION |
-73.14041 | -50.84305 | HUMAN_OBSERVATION |
-71.85057 | -45.99832 | HUMAN_OBSERVATION |
-72.07593 | -46.05139 | HUMAN_OBSERVATION |
-71.91163 | -45.84344 | HUMAN_OBSERVATION |
-71.91210 | -46.12133 | HUMAN_OBSERVATION |
-71.81252 | -46.04818 | HUMAN_OBSERVATION |
-72.97587 | -51.18353 | HUMAN_OBSERVATION |
-73.03667 | -51.04976 | HUMAN_OBSERVATION |
-72.93940 | -49.37483 | HUMAN_OBSERVATION |
-72.91720 | -49.30175 | HUMAN_OBSERVATION |
-72.97712 | -51.01511 | HUMAN_OBSERVATION |
-71.87026 | -46.08686 | HUMAN_OBSERVATION |
-72.02424 | -45.92156 | HUMAN_OBSERVATION |
-72.89062 | -46.03708 | 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.00000 | -30.00000 | PRESERVED_SPECIMEN |
-71.00000 | -30.00000 | 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 |
-70.91129 | -53.15483 | PRESERVED_SPECIMEN |
-73.84761 | -42.54746 | PRESERVED_SPECIMEN |
-71.00000 | -30.00000 | PRESERVED_SPECIMEN |
-71.00000 | -30.00000 | 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
basisOfRecord | N |
---|---|
HUMAN_OBSERVATION | 119 |
PRESERVED_SPECIMEN | 70 |
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/variables-basicas-ambientales/bases-de-datos/series-cronol%C3%B3gicas-de-las-variables-b%C3%A1sicas-ambientales/dimension-aire-factor-estado-excel.xlsx?sfvrsn=c200127c_2",
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.
Partimos leyendo la pestaña que contiene las estaciones meteorológicas con su código:
## New names:
## * `` -> ...8
## * `` -> ...9
## * `` -> ...10
## * `` -> ...11
## * `` -> ...12
## * … and 1 more problem
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.
Luego empezamos a trabajar con la base de datos de temperatura media, para esto leemos la pestaña 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.
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.
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.
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) %>% 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) %>% 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
## Joining, by = c("Mes", "Year", "Ciudad_localidad")
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
TempHumMonthly <- TempHum %>% select(-Year) %>% group_by(Mes,
Ciudad_localidad) %>% summarize_all(funs(mean, sd), na.rm = TRUE)
Mes | Ciudad_localidad | TempMedia_mean | HumMedia_mean | TempMedia_sd | HumMedia_sd |
---|---|---|---|---|---|
1 | Antártica Chilena | 1.383784 | 87.240 | 0.6238383 | 3.027045 |
1 | Antofagasta | 20.186487 | 70.120 | 0.9068144 | 1.666433 |
1 | Arica | 22.421622 | 63.960 | 0.9684280 | 3.453694 |
1 | Balmaceda | 12.334286 | 57.520 | 1.2107224 | 3.346192 |
1 | Calama | 17.000000 | 25.000 | NA | NA |
1 | Cerrillos | 20.996000 | NaN | 0.7855359 | NaN |
1 | Chillán | 19.794286 | 60.960 | 0.7490947 | 5.691046 |
1 | Concepción | 16.729730 | 72.060 | 0.6753044 | 6.944278 |
1 | Copiapó | 19.604348 | NaN | 0.7449700 | NaN |
1 | Coyhaique | 13.943243 | 59.520 | 1.2568790 | 3.088203 |
1 | Curicó | 20.697143 | 57.920 | 0.8143874 | 6.695670 |
1 | Graneros | 21.480000 | NaN | 0.4661330 | NaN |
1 | Iquique | 21.856757 | 62.180 | 1.0930438 | 3.594718 |
1 | Isla Juan Fernández | 18.562162 | 70.180 | 0.5832625 | 3.523067 |
1 | La Serena | 17.355556 | 76.260 | 0.7643651 | 2.833372 |
1 | Osorno | 15.807407 | 71.560 | 0.9388725 | 6.008993 |
1 | Pudahuel | 20.735135 | 45.775 | 0.8743938 | 5.933169 |
1 | Puerto Montt | 14.461111 | 77.760 | 0.7104436 | 2.230022 |
1 | Punta Arenas | 10.848649 | 62.560 | 0.7343257 | 2.900517 |
1 | Quinta Normal | 21.327027 | 50.600 | 0.6768590 | 8.341163 |