# library(dplyr)
# library(tidyr)
# library(pander)
# 
# data(pnud_muni, package = 'abjutils')
# names(pnud_muni)[names(pnud) %>% stringr::str_detect("(Muni)?(pio)")] <- "municipio"

library(magrittr)
library(tidyr)
library(mcUFSCar2015)  

pipe

Operador pipe (%>%)

install.packages("magrittr")
library(magrittr)

Uso do %>% {.build}

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

Por quê o pipe é legal?

Exemplo: Receita de bolo

esfrie(asse(coloque(bata(acrescente(recipiente(
  rep("farinha", 2), "água", "fermento", "leite", "óleo"), 
  "farinha", até = "macio"), duração = "3min"), 
  lugar = "forma", tipo = "grande", 
  untada = T), duração = "50min"), "geladeira", "20min")

Legibilidade!

recipiente(rep("farinha", 2), "água", "fermento", "leite", "óleo") %>%
  acrescente("farinha", até = "macio") %>%
  bata(duração = "3min") %>%
  coloque(lugar = "forma", tipo = "grande", untada = T) %>%
  asse(duração = "50min") %>%
  esfrie("geladeira", "20min")

Uso do %>% com .

TRUE %>% mean(c(NA, 1:101), na.rm = .)
FALSE %>% mean(c(NA, 1:101), na.rm = .)

Exercício {.build}

1:101 %>% 
  c(NA) %>% 
  mean(na.rm = TRUE)

Detalhes

Com {} - Não passa o argumento implicitamente

1:10 %>% c(min(.), max(.))
1:10 %>% { c(min(.), max(.)) }
1:10 %>% { c() }

Detalhes

Sem {} - Já assume que primeiro parâmetro = .

1:4 %>% sum
1:4 %>% sum()
1:4 %>% sum(.)

Detalhes

A menos que você coloque outra coisa como parâmetro inicial

1:4 %>% sum(1:4)
1:4 %>% sum(1:4, .)
1:4 %>% sum(., 1:4, .)

Expressões

m1 <- mtcars %>%  {
  .$cyl2 <- .$cyl ^ 2
  lm(mpg ~ cyl2, data = .)
}

mtcars$cyl2 <- mtcars$cyl ^ 2
m2 <- lm(mpg ~ cyl2, data = mtcars)

list(m1, m2) %>% lapply(coef)

dplyr

Motivação

“(...) The fact that data science exists as a field is a colossal failure of statistics. To me, [what I do] is what statistics is all about. It is gaining insight from data using modelling and visualization. Data munging and manipulation is hard and statistics has just said that’s not our domain.”

Hadley Wickham

Manipulação de dados com dplyr

Introdução

Introdução

library(dplyr) # mensagens de warning chatas

Trabalhando com tbl e tbl_df

cdg %>% tbl_df

Os cinco verbos do dplyr {.build}

Características

Vantagens

dplyr::select

select {.build}

# especificando nomes (maneira mais usual)
cdg %>%
  select(mandante, placar, visitante)
# por indice (nao recomendavel!)
cdg %>%
  select(1:5)
# intervalos e funcoes auxiliares (para economizar trabalho)
cdg %>%
  select(ano, placar, starts_with('p_'), -p_vitorioso)

Exercício

Selecione ano, todas as variáveis relacionadas ao mandante e todas as variáveis relacionadas ao visitante

dplyr::filter

filter

# somente Bahia como mandante, ano maior que 2005
cdg %>%
  select(ano, mandante) %>%
  filter(mandante == 'Bahia', ano > 2005)
# mesma coisa que o anterior
pnud_muni %>%
  select(ano, ufn, municipio, idhm) %>%
  filter(mandante == 'Bahia' & ano > 2005)

filter

cdg %>%
  select(mandante, placar, visitante) %>%
  filter(placar != '0x0')

filter

# %in%
cdg %>%
  select(mandante, placar, visitante) %>%
  filter(mandante %in% c('São Paulo', 'Palmeiras', 'Corinthians'))

Exercício

Seleciona ano, mandante, placar e visitante e depois filtre para jogos que envolveram somente os times Internacional e Santos, que tiveram placar de 3x0 ou 0x3

dplyr::mutate

mutate

mutate

# media de idhm_l e idhm_e
cdg %>%
  select(ano, mandante:visitante) %>%
  mutate(gols_mandante = as.numeric(str_sub(placar, 1, 1)),
         gols_visitante = as.numeric(str_sub(placar, 3, 3)))

mutate

# errado
cdg %>%
  select(ano, mandante:visitante) %>%
  mutate(gols_mandante = as.numeric(str_sub(placar, 1, 1)),
         gols_visitante = as.numeric(str_sub(placar, 3, 3)),
         total_gols = sum(gols_mandante, gols_visitante))

# correto
cdg %>%
  select(ano, mandante:visitante) %>%
  mutate(gols_mandante = as.numeric(str_sub(placar, 1, 1)),
         gols_visitante = as.numeric(str_sub(placar, 3, 3)),
         total_gols = gols_mandante + gols_visitante)

OBS: mais elegante com tidyr::separate

# media de idhm_l e idhm_e
cdg %>%
  select(ano, mandante:visitante) %>%
  separate(placar, c('gols_mandante', 'gols_visitante'), 
           sep = 'x', remove = FALSE, convert = TRUE)

Exercício

Selecione ano, mandante, placar, visitante e as probabilidades dos resultados no ano de 2011. Verifique quais as probabilidades não têm soma 100. Dica: usar tidyr::extract_numeric.

dplyr::arrange

arrange

arrange

cdg %>%
  select(ano, mandante:visitante, p_vitorioso) %>%
  filter(ano == 2010) %>%
  mutate(p_vitorioso_num = extract_numeric(p_vitorioso)) %>%
  arrange(p_vitorioso_num)

arrange

cdg %>%
  select(ano, mandante:visitante, p_vitorioso) %>%
  filter(ano == 2010) %>%
  mutate(p_vitorioso_num = extract_numeric(p_vitorioso)) %>%
  arrange(desc(p_vitorioso_num))

Exercício

Selecione somente ano, mandante, placar, visitante. Filtre para ano de 2012. Ordene por mandante e visitante.

dplyr::summarise

summarise

summarise

cdg %>%
  select(ano, mandante:visitante) %>%
  mutate(gols_mandante = as.numeric(str_sub(placar, 1, 1)),
         gols_visitante = as.numeric(str_sub(placar, 3, 3)),
         total_gols = gols_mandante + gols_visitante) %>% 
  group_by(ano) %>% 
  summarise(total = sum(total_gols), media = mean(total_gols))

count

cdg %>%
  count(mandante, ano)

summarise equivalente

cdg %>%
  group_by(mandante, ano) %>% 
  summarise(n = n())

Exercício

Faça uma tabela descritiva da distribuição do número de gols em cada ano.

tidyr

Data Tidying com tidyr

library(tidyr)

Exemplo

comparacao <- cdg %>% 
  select(ano, mandante:visitante) %>% 
  filter(mandante %in% c('Corinthians', 'Vasco') |
           visitante %in% c('Corinthians', 'Vasco')) %>% 
  separate(placar, c('gols_mandante', 'gols_visitante'), 
           sep = 'x', remove = TRUE, convert = TRUE) %>% 
  group_by(ano) %>% 
  summarise(corinthians = sum(gols_mandante[mandante == 'Corinthians']),
            corinthians = corinthians + sum(gols_visitante[visitante == 'Corinthians']),
            vasco = sum(gols_mandante[mandante == 'Vasco']),
            vasco = vasco + sum(gols_visitante[visitante == 'Vasco']))
comparacao

gather

comparacao %>% 
  gather(time, gols, -ano)

spread

comparacao %>% 
  gather(time, gols, -ano) %>% 
  spread(ano, gols)

Exercício

Verifique se gather(spread(dados)), spread(gather(dados)) e dados são equivalentes.

Funções auxiliares

Miscelânea

Apenas jogos no mês de Dezembro

library(lubridate)
cdg %>% 
  mutate(data_jogo = ifelse(ano < 2007, sprintf('%s/%s', data_jogo, ano), data_jogo),
         data_jogo = as.Date(dmy(data_jogo))) %>% 
  filter(month(data_jogo) == 12)

Miscelânea

Times com maiores médias de gols

cdg %>% 
  filter(mandante != '') %>% 
  select(mandante:visitante) %>% 
  separate(placar, c('gols_mandante', 'gols_visitante'), 
         sep = 'x', remove = TRUE, convert = TRUE) %>% 
  unite(mandante_u, mandante, gols_mandante, sep = '_') %>% 
  unite(visitante_u, visitante, gols_visitante, sep = '_') %>% 
  gather() %>% 
  separate(value, c('time', 'gols'), sep = '_', convert = TRUE) %>% 
  group_by(time) %>% 
  summarise(n_jogos = n(), media = mean(gols), desv_pad = sd(gols)) %>% 
  arrange(desc(media))

Um pouco mais de manipulação de dados

Outros pacotes úteis para limpar bases de dados




curso-r/mcUFSCar2015 documentation built on May 14, 2019, 12:51 p.m.