6 {dplyr}

Recordemos la sintaxis R base

x <- c(1, 2, 3, 4)
sqrt(sum(x))

Como sería su equivalente bajo la sintaxis de tidyverse?

library(tidyverse)
x %>% sum %>% sqrt

Ya tuvimos un primer panorama de la visualización de datos con ggplot2, que es parte el “universo ordenado”.

Con el avance de nuestro trabajo con R iremos entendiendo el gran maridaje que tienen los paquetes entre si.

Empecemos con uno de los mas potentes paquetes del ecosistema tidyverse:

Para eso importemos el dataset balcarce desde la carpeta data

bce_met_raw <- rio::import("data/datos_curso.xls", sheet ="bce_met")
str(bce_met_raw)

dplyr is a grammar of data manipulation, providing a consistent set of verbs that help you solve the most common data manipulation challenges:

6.1 mutate()

Son varias las manipulaciones que podemos realizar con dplyr

  1. Agregar nuevas variables en funcion de otras pre-existentes

agreguemos la temperatura media en base a la tmin y tmax

bce_met0 <- bce_met_raw %>% 
  mutate(tmean = (tmax + tmin) / 2)

head(bce_met)
  1. Modificar variables existentes

pasemos “fecha” de formato caracter a su formato correcto

Acoplemos a lubridate

library(lubridate)

bce_met1 <- bce_met0 %>% mutate(date = dmy(fecha))

head(bce_met1)

ya que estamos extraigamos mas columnas relacionadas a la fecha

bce_met1 <- bce_met1 %>% 
  mutate(month = month(date), 
         julian = yday(date))
head(bce_met1)

creamos una nueva columna en base a una condición binaria

if_else

bce_met1 <- bce_met1 %>% 
  mutate(frost = if_else(tmin<=0, TRUE, FALSE))
head(bce_met1)

creamos una nueva columna en base a una condición multiple

case_when

bce_met2 <- bce_met1 %>% 
  mutate(
    ambiente = case_when(
      tmean < 10  ~ "fresco", 
      tmean > 10 & tmean < 20  ~ "templado",
      tmean > 20  ~ "calido")
  )

bce_met2

6.2 select()

Selecciona variables basadas en sus nombres

Descartemos “fecha”

Opción 1

bce_met2 <- bce_met1 %>% 
  select(date, month, tmean, tmax, tmin, rad, frost)

head(bce_met2)

Opción 2

bce_met2 <- bce_met1 %>% 
  select(-fecha)

head(bce_met2)

Opción 3

bce_met2 <- bce_met1 %>% 
  select(date, month, contains("tm"), rad, frost)

head(bce_met2)

6.3 filter()

Filtra filas en base a alguna condición

veamos que dias tuvieron heladas

bce_met2 %>% 
  filter(tmin<=0)
bce_met2 %>% 
  filter(frost==TRUE)

6.4 count()

Cuenta el numero de observaciones por grupo

bce_met2 %>% 
  count(frost)
  • se puede agregar mas niveles de agrupamiento
bce_met2 %>% 
  count(month, frost)

bce_met2 %>% 
  count(frost, month)

6.5 summarise()

Reduce multiples valores a valores resumenes. Generalmente combinado con group_by()

para cada mes: cuantos dias helaron y cual fue la temp media

bce_met2 %>% 
  group_by(month) %>% 
  summarise(tmean=mean(tmean), 
            n_frost=sum(frost)) -> bce_sum
bce_sum

6.6 arrange()

Cambia el orden de las filas

bce_sum %>%
  arrange(n_frost)

bce_sum %>%
  arrange(-n_frost)

Ya que hicimos tantas modificaciones a los datos es un buen momento para guardar en formato .Rdata

save(bce_met_raw, bce_met2, bce_sum, file="data/datos_curso.Rdata")

Gráfico de Temperaturas media

ggplot(bce_met2) + 
  aes(x=date, y=tmean)+
  geom_line() +
  scale_x_date(date_breaks = "1 month", date_labels = "%b")+
  theme(axis.text.x = element_text(angle=45, hjust = 1)) + 
  labs(x="", y="Mean temperature (ºC)") + 
  theme_bw() + 
  theme(axis.text.x = element_text(angle=45, hjust = 1))

nos interesa visualizar los meses en que se desarrolla el trigo (de junio a diciembre)

ggplot(bce_met2) + 
  aes(x=date)+
  geom_line(aes(y = tmax, col = "Máxima"), alpha=.5) +
  geom_line(aes(y = tmin, col = "Mínima"), alpha=.5) +
  scale_colour_manual("Temperatura",
                      values = c("Media" = "black", 
                                 "Máxima" = "red", 
                                 "Mínima" = "blue"))+ 
    geom_point(data = bce_met2 %>% filter(tmin<3), 
             aes(x=date, y=0), 
             shape=8, col="blue") + 
  theme_bw() + 
  scale_x_date(date_breaks = "1 month", date_labels = "%b",
               limits = as.Date(c("2018-06-01", "2018-31-12")))+
  theme(axis.text.x = element_text(angle=45, hjust = 1))

6.7 {forcats}

El paquete {forcats} hace un aporte clave para la manipulación de los niveles de un factor. Retomemos un ejemplo de tipico de visualización con iris

iris %>%
  ggplot() +
  aes(x=Species, y=Sepal.Length)+
  geom_boxplot(fill="gray90")+
  geom_jitter()+
  labs(x= "Species", y="Sepal length (cm)") + 
  theme_bw()

Reordenar niveles de un factor

iris %>%
  mutate(
    Species= fct_relevel(Species,"virginica")
    ) %>%
  ggplot() +
  aes(x=Species, y=Sepal.Length)+
  geom_boxplot(fill="gray90")+
  geom_jitter()+
  labs(x= "Species", y="Sepal length (cm)") + 
  theme_bw()

Renombrar niveles de un factor

iris %>%
  mutate(
    Species= fct_recode(Species,
                        "Setosa"="setosa", 
                        "Versicolor"="versicolor", 
                        "Virginica"="virginica")
    ) %>%
  ggplot() +
  aes(x=Species, y=Sepal.Length)+
  geom_boxplot(fill="gray90")+
  geom_jitter()+
  labs(x= "Species", y="Sepal length (cm)") + 
  theme_bw()

6.8 join()

Retomemos los datos de bce_met2 que por suerte los tenemos guardados como .Rdata para un rapido retome (nos ahorramos los pasos anteriores)

# paquetes que iremos a usar en esta sesion
pacman::p_load(tidyverse, lubridate, rio, janitor, nasapower)
# datos guardados en la sesion previa
load("data/datos_curso.Rdata")

Nos acaban de pasar los datos de lluvias de Balcarce en 2018

bce_lluvias_raw  <- rio::import("data/datos_curso.xls", sheet ="bce_lluvias")

seria interesante poder acoplar a nuestro dataset bce_met2

Veamos los datos meteorologicos de Balcarce:

bce_met2
bce_lluvias_raw 

Si hacemos la misma conversion fecha a date tendriamos una columna en comun

bce_lluvias <- bce_lluvias_raw %>% 
  mutate(date = dmy(fecha)) %>% 
  select(-fecha)

str(bce_lluvias)

Ahora hagamos uso de left_join() para que matcheen las filas y se peguen la columna de lluvia a bce_met2

bce_full <- bce_met2 %>% 
  left_join(bce_lluvias, by="date") 

str(bce_full)

# veamos otra utilidad mas de mutate!
bce_full <- bce_met2 %>% 
  left_join(bce_lluvias, by="date") 
  mutate(pp = replace_na(pp, 0))

str(bce_full)
ggplot(bce_full) + 
  aes(x=date)+
  geom_col(aes(y = pp)) + 
  theme_bw() + 
  scale_x_date(date_breaks = "1 month", date_labels = "%b",
               limits = as.Date(c("2018-06-01", "2018-31-12")))+
  theme(axis.text.x = element_text(angle=45, hjust = 1))