Módulo 1 Breve introdução ao R

1.1 Objetivo

Revisar conceitos, pacotes e funções fundamentais na linguagem R para executar tarefas como:
* Importar um conjunto de dados de um arquivo;
* Selecionar ou remover colunas;
* Filtrar linhas de um conjunto de dados de acordo com uma ou mais condições;
* Agrupar e sumarizar dados;
* Manipular estruturas de dados, mudando seus formatos;
* Operações básicas com datas

1.2 Introdução ao R

O R é uma linguagem de programação inicialmente criada para fins estatísticos mas que, com o crescimento de sua popularidade, aumentou o seu escopo, sendo hoje uma das melhores ferramentas existentes para tarefas como automação de tarefas, web scraping, desenvolvimento de web apps e principalmente visualização de dados.

Um dos maiores marcos no universo R foi a criação do pacote ggplot2, desenvolvido principalmente por Hadley Wickham, que implementou a abordagem da Gramática dos Gráficos. O ggplot2 faz parte do tidyverse, que é uma suíte de pacotes R criadas e mantidas também por Hadley Wickham para realizar todo o pipeline de um projeto de análise de dados de maneira harmônica.

Durante o restante da aula, usaremos muitos pacotes da suíte tidyverse. Por isso, importe o pacote usando o comando usual:

library(tidyverse) # install.packages("tidyverse")
# chequem se a versao dos seus pacotes é a mesma das minhas
# devtools::session_info()
# sessionInfo()

1.3 Leitura de dados com readr

O primeiro ponto de qualquer projeto de análise de dados é obter os dados. Muitas das vezes, os dados são fornecidos em arquivos locais em formatos como .csv, .xlsx, .txt., etc.

O R possui funções nativas para ler certos arquivos de dados, mas o pacote readr possui recursos mais otimizados.

Para este módulo, utilizaremos como base de dados de exercícios o dataset de Despesas do Governo de Alagoas, que tem se destacado por suas iniciativas de dados abertos.

Veja que o próprio processo de download dos dados pode ser feito com R:

# salvar url de download no objeto link
link <- "http://transparencia.al.gov.br/media/arquivo/comparativo_despesas-2017.zip"
# criar pasta chamada data para armazenar o arquivo
dir.create("data/")
# realizar o download do arquivo
download.file(link, destfile = "data/desp_al_2017.zip")
# descompactar o arquivo na pasta data
unzip("data/desp_al_2017.zip", exdir = "data/")
# Importando o arquivo de 2017

# usamos a função read_delim porque o arquivo vem separado por
# barras verticais (|)

# alem disso, precisamos especificar o locale para caracteres especiais
# serem importados corretamente para o R
df_despesas <- read_delim("data/comparativo_despesas-2017.txt",
                          delim = "|",
                          locale = locale(encoding = "ISO-8859-1"),
                          # progress = FALSE, para nao mostrar a barra de progresso
                          progress = FALSE)
# exibir as 6 primeiras linhas do arquivo importado
head(df_despesas)
## # A tibble: 6 x 44
##     ANO   MES UG    DESCRICAO_UG GESTAO PT    PT_DESCRICAO FONTE_MAE
##   <int> <int> <chr> <chr>        <chr>  <chr> <chr>        <chr>    
## 1  2017    11 5105… UNIVERS EST… 51556  1030… MANUTENCAO … 0100     
## 2  2017    11 5105… UNIVERS EST… 51556  1030… MANUTENCAO … 0100     
## 3  2017    12 5400… SEC DE ESTA… 00001  0612… MANUTENCAO … 0100     
## 4  2017     7 5400… SEC DE ESTA… 00001  0612… MANUTENCAO … 0100     
## 5  2017     6 5400… SEC DE ESTA… 00001  0618… MANUTENCAO … 0100     
## 6  2017    10 5400… POLICIA MIL… 00001  0618… MANUTENCAO … 0100     
## # ... with 36 more variables: DESCRICAO_FONTE_MAE <chr>, FONTE <chr>,
## #   DESCRICAO_FONTE <chr>, PI <chr>, CODIGO_FAVORECIDO <chr>,
## #   NOME_FAVORECIDO <chr>, NATUREZA1 <int>, DESCRICAO_NATUREZA1 <chr>,
## #   NATUREZA2 <int>, DESCRICAO_NATUREZA2 <chr>, NATUREZA3 <int>,
## #   DESCRICAO_NATUREZA3 <chr>, NATUREZA4 <int>, DESCRICAO_NATUREZA4 <chr>,
## #   NATUREZA5 <int>, DESCRICAO_NATUREZA5 <chr>, NATUREZA6 <int>,
## #   DESCRICAO_NATUREZA6 <chr>, NATUREZA <int>, DESCRICAO_NATUREZA <chr>,
## #   DATA_REGISTRO <date>, PROJETO_ATIVIDADE_ID <dbl>, PROGRAMA_ID <int>,
## #   SUB_FUNCAO_ID <int>, PT_FUNCAO_ID <int>, FONTE_MAE_ID <int>,
## #   FONTE_ID <dbl>, FL_DIARIA <int>, FL_FAVORECIDO <int>, SUBTITULO <int>,
## #   DESCRICAO_SUBTITULO <chr>, ORGAO <chr>, ORGAO_DESCRICAO <chr>,
## #   VALOR_EMPENHADO <dbl>, VALOR_LIQUIDADO <dbl>, VALOR_PAGO <dbl>

Na função read_delim acima, precisamos especificar três argumentos:
* o nome do arquivo a ser importado
* o caracter usado para separar colunas (normalmente é ponto-e-vírgula)
* o locale (encoding), muitas vezes necessários ao trabalhar com Linux com arquivos brasileiros

1.4 dplyr

O pacote dplyr é o mais usado para as mais variadas tarefas de manuseio de dados: agregar, sumarizar, filtrar, ordenar, criar variáveis, joins, dentre outras.

Vamos continuar usando o dataset das despesas do estado de Alagoas para demonstrar o uso das principais funções do dplyr

Materiais mais completos sobre o pacote dplyr podem ser encontrados nas referências abaixo:

1.4.1 select()

Select é uma função muito simples: serve para selecionar ou remover colunas.

# Tarefa: selecionar colunas ANO, UG e GESTAO, mudando o nome da última
df_despesas %>% select(ANO = ANO, UG, CODIGO_GESTAO = GESTAO) %>% head()
## # A tibble: 6 x 3
##     ANO UG     CODIGO_GESTAO
##   <int> <chr>  <chr>        
## 1  2017 510556 51556        
## 2  2017 510556 51556        
## 3  2017 540033 00001        
## 4  2017 540033 00001        
## 5  2017 540033 00001        
## 6  2017 540034 00001
# tarefa: remover coluna ANO
df_despesas %>% select(-ANO) %>% head()
## # A tibble: 6 x 43
##     MES UG    DESCRICAO_UG GESTAO PT    PT_DESCRICAO FONTE_MAE
##   <int> <chr> <chr>        <chr>  <chr> <chr>        <chr>    
## 1    11 5105… UNIVERS EST… 51556  1030… MANUTENCAO … 0100     
## 2    11 5105… UNIVERS EST… 51556  1030… MANUTENCAO … 0100     
## 3    12 5400… SEC DE ESTA… 00001  0612… MANUTENCAO … 0100     
## 4     7 5400… SEC DE ESTA… 00001  0612… MANUTENCAO … 0100     
## 5     6 5400… SEC DE ESTA… 00001  0618… MANUTENCAO … 0100     
## 6    10 5400… POLICIA MIL… 00001  0618… MANUTENCAO … 0100     
## # ... with 36 more variables: DESCRICAO_FONTE_MAE <chr>, FONTE <chr>,
## #   DESCRICAO_FONTE <chr>, PI <chr>, CODIGO_FAVORECIDO <chr>,
## #   NOME_FAVORECIDO <chr>, NATUREZA1 <int>, DESCRICAO_NATUREZA1 <chr>,
## #   NATUREZA2 <int>, DESCRICAO_NATUREZA2 <chr>, NATUREZA3 <int>,
## #   DESCRICAO_NATUREZA3 <chr>, NATUREZA4 <int>, DESCRICAO_NATUREZA4 <chr>,
## #   NATUREZA5 <int>, DESCRICAO_NATUREZA5 <chr>, NATUREZA6 <int>,
## #   DESCRICAO_NATUREZA6 <chr>, NATUREZA <int>, DESCRICAO_NATUREZA <chr>,
## #   DATA_REGISTRO <date>, PROJETO_ATIVIDADE_ID <dbl>, PROGRAMA_ID <int>,
## #   SUB_FUNCAO_ID <int>, PT_FUNCAO_ID <int>, FONTE_MAE_ID <int>,
## #   FONTE_ID <dbl>, FL_DIARIA <int>, FL_FAVORECIDO <int>, SUBTITULO <int>,
## #   DESCRICAO_SUBTITULO <chr>, ORGAO <chr>, ORGAO_DESCRICAO <chr>,
## #   VALOR_EMPENHADO <dbl>, VALOR_LIQUIDADO <dbl>, VALOR_PAGO <dbl>
# tarefa: selecionar todas as colunas numéricas
df_despesas %>% select_if(is.numeric) %>% head()
## # A tibble: 6 x 21
##     ANO   MES NATUREZA1 NATUREZA2 NATUREZA3 NATUREZA4 NATUREZA5 NATUREZA6
##   <int> <int>     <int>     <int>     <int>     <int>     <int>     <int>
## 1  2017    11 300000000 330000000 331000000 331900000 331900000 331901100
## 2  2017    11 300000000 330000000 331000000 331900000 331900000 331901100
## 3  2017    12 300000000 330000000 333000000 333900000 333900000 333903900
## 4  2017     7 300000000 330000000 333000000 333900000 333900000 333903900
## 5  2017     6 300000000 330000000 333000000 333900000 333900000 333903100
## 6  2017    10 300000000 330000000 333000000 333900000 333900000 333903900
## # ... with 13 more variables: NATUREZA <int>, PROJETO_ATIVIDADE_ID <dbl>,
## #   PROGRAMA_ID <int>, SUB_FUNCAO_ID <int>, PT_FUNCAO_ID <int>,
## #   FONTE_MAE_ID <int>, FONTE_ID <dbl>, FL_DIARIA <int>,
## #   FL_FAVORECIDO <int>, SUBTITULO <int>, VALOR_EMPENHADO <dbl>,
## #   VALOR_LIQUIDADO <dbl>, VALOR_PAGO <dbl>
# tarefa: selecionar apenas as colunas cujo nome começa com VALOR
df_despesas %>% select(starts_with("VALOR")) %>% head()
## # A tibble: 6 x 3
##   VALOR_EMPENHADO VALOR_LIQUIDADO VALOR_PAGO
##             <dbl>           <dbl>      <dbl>
## 1          25557.          25557.     25557.
## 2          36652.          36652.     36652.
## 3          84031.              0      78990.
## 4         173834.              0          0 
## 5            292.            292.         0 
## 6          38072.              0          0

1.4.2 filter()

filter() permite que você crie filtros de observações baseado em um ou mais critérios.

Os critérios podem ser construídos com os operadores lógicos >, >=, <, <=, != e ==, ou com funções que retornam uma booleana (resultado lógico, TRUE ou FALSE).

# tarefa: filtrar as linhas onde o valor da coluna VALOR_EMPENHADO é maior que 100000
df_despesas %>% filter(VALOR_EMPENHADO > 100000) %>% head()
## # A tibble: 6 x 44
##     ANO   MES UG    DESCRICAO_UG GESTAO PT    PT_DESCRICAO FONTE_MAE
##   <int> <int> <chr> <chr>        <chr>  <chr> <chr>        <chr>    
## 1  2017     7 5400… SEC DE ESTA… 00001  0612… MANUTENCAO … 0100     
## 2  2017     5 5400… POLICIA MIL… 00001  0618… MANUTENCAO … 0100     
## 3  2017     4 5400… SEC DE ESTA… 00001  0684… CONTRIBUICA… 0100     
## 4  2017    10 5400… CORPO DE BO… 00001  0612… MANUTENCAO … 0100     
## 5  2017     1 9109… ENCARGOS GE… 00001  2884… SERVICOS DA… 0100     
## 6  2017     8 5400… POLICIA CIV… 00001  0618… MANUTENCAO … 0100     
## # ... with 36 more variables: DESCRICAO_FONTE_MAE <chr>, FONTE <chr>,
## #   DESCRICAO_FONTE <chr>, PI <chr>, CODIGO_FAVORECIDO <chr>,
## #   NOME_FAVORECIDO <chr>, NATUREZA1 <int>, DESCRICAO_NATUREZA1 <chr>,
## #   NATUREZA2 <int>, DESCRICAO_NATUREZA2 <chr>, NATUREZA3 <int>,
## #   DESCRICAO_NATUREZA3 <chr>, NATUREZA4 <int>, DESCRICAO_NATUREZA4 <chr>,
## #   NATUREZA5 <int>, DESCRICAO_NATUREZA5 <chr>, NATUREZA6 <int>,
## #   DESCRICAO_NATUREZA6 <chr>, NATUREZA <int>, DESCRICAO_NATUREZA <chr>,
## #   DATA_REGISTRO <date>, PROJETO_ATIVIDADE_ID <dbl>, PROGRAMA_ID <int>,
## #   SUB_FUNCAO_ID <int>, PT_FUNCAO_ID <int>, FONTE_MAE_ID <int>,
## #   FONTE_ID <dbl>, FL_DIARIA <int>, FL_FAVORECIDO <int>, SUBTITULO <int>,
## #   DESCRICAO_SUBTITULO <chr>, ORGAO <chr>, ORGAO_DESCRICAO <chr>,
## #   VALOR_EMPENHADO <dbl>, VALOR_LIQUIDADO <dbl>, VALOR_PAGO <dbl>
# tarefa: filtrar as linhas onde o ANO é o mesmo do atual
df_despesas %>% filter(ANO == lubridate::year(lubridate::today()))
## # A tibble: 0 x 44
## # ... with 44 variables: ANO <int>, MES <int>, UG <chr>,
## #   DESCRICAO_UG <chr>, GESTAO <chr>, PT <chr>, PT_DESCRICAO <chr>,
## #   FONTE_MAE <chr>, DESCRICAO_FONTE_MAE <chr>, FONTE <chr>,
## #   DESCRICAO_FONTE <chr>, PI <chr>, CODIGO_FAVORECIDO <chr>,
## #   NOME_FAVORECIDO <chr>, NATUREZA1 <int>, DESCRICAO_NATUREZA1 <chr>,
## #   NATUREZA2 <int>, DESCRICAO_NATUREZA2 <chr>, NATUREZA3 <int>,
## #   DESCRICAO_NATUREZA3 <chr>, NATUREZA4 <int>, DESCRICAO_NATUREZA4 <chr>,
## #   NATUREZA5 <int>, DESCRICAO_NATUREZA5 <chr>, NATUREZA6 <int>,
## #   DESCRICAO_NATUREZA6 <chr>, NATUREZA <int>, DESCRICAO_NATUREZA <chr>,
## #   DATA_REGISTRO <date>, PROJETO_ATIVIDADE_ID <dbl>, PROGRAMA_ID <int>,
## #   SUB_FUNCAO_ID <int>, PT_FUNCAO_ID <int>, FONTE_MAE_ID <int>,
## #   FONTE_ID <dbl>, FL_DIARIA <int>, FL_FAVORECIDO <int>, SUBTITULO <int>,
## #   DESCRICAO_SUBTITULO <chr>, ORGAO <chr>, ORGAO_DESCRICAO <chr>,
## #   VALOR_EMPENHADO <dbl>, VALOR_LIQUIDADO <dbl>, VALOR_PAGO <dbl>
# tarefa: filtrar as linhas de Junho/2017
df_despesas %>% filter(ANO == 2017, MES > 6) %>% head()
## # A tibble: 6 x 44
##     ANO   MES UG    DESCRICAO_UG GESTAO PT    PT_DESCRICAO FONTE_MAE
##   <int> <int> <chr> <chr>        <chr>  <chr> <chr>        <chr>    
## 1  2017    11 5105… UNIVERS EST… 51556  1030… MANUTENCAO … 0100     
## 2  2017    11 5105… UNIVERS EST… 51556  1030… MANUTENCAO … 0100     
## 3  2017    12 5400… SEC DE ESTA… 00001  0612… MANUTENCAO … 0100     
## 4  2017     7 5400… SEC DE ESTA… 00001  0612… MANUTENCAO … 0100     
## 5  2017    10 5400… POLICIA MIL… 00001  0618… MANUTENCAO … 0100     
## 6  2017     7 5305… DEPARTAM DE… 53538  2612… MANUTENCAO … 0291     
## # ... with 36 more variables: DESCRICAO_FONTE_MAE <chr>, FONTE <chr>,
## #   DESCRICAO_FONTE <chr>, PI <chr>, CODIGO_FAVORECIDO <chr>,
## #   NOME_FAVORECIDO <chr>, NATUREZA1 <int>, DESCRICAO_NATUREZA1 <chr>,
## #   NATUREZA2 <int>, DESCRICAO_NATUREZA2 <chr>, NATUREZA3 <int>,
## #   DESCRICAO_NATUREZA3 <chr>, NATUREZA4 <int>, DESCRICAO_NATUREZA4 <chr>,
## #   NATUREZA5 <int>, DESCRICAO_NATUREZA5 <chr>, NATUREZA6 <int>,
## #   DESCRICAO_NATUREZA6 <chr>, NATUREZA <int>, DESCRICAO_NATUREZA <chr>,
## #   DATA_REGISTRO <date>, PROJETO_ATIVIDADE_ID <dbl>, PROGRAMA_ID <int>,
## #   SUB_FUNCAO_ID <int>, PT_FUNCAO_ID <int>, FONTE_MAE_ID <int>,
## #   FONTE_ID <dbl>, FL_DIARIA <int>, FL_FAVORECIDO <int>, SUBTITULO <int>,
## #   DESCRICAO_SUBTITULO <chr>, ORGAO <chr>, ORGAO_DESCRICAO <chr>,
## #   VALOR_EMPENHADO <dbl>, VALOR_LIQUIDADO <dbl>, VALOR_PAGO <dbl>
# Tarefa: filtrar as linhas dentro de um intervalo de datas (inclusivo)
df_despesas %>%
  filter(between(DATA_REGISTRO,
                 as.Date("2017-11-15"),
                 as.Date("2017-12-15"))) %>% 
  head()
## # A tibble: 6 x 44
##     ANO   MES UG    DESCRICAO_UG GESTAO PT    PT_DESCRICAO FONTE_MAE
##   <int> <int> <chr> <chr>        <chr>  <chr> <chr>        <chr>    
## 1  2017    11 5105… UNIVERS EST… 51556  1030… MANUTENCAO … 0100     
## 2  2017    11 5105… UNIVERS EST… 51556  1030… MANUTENCAO … 0100     
## 3  2017    11 5400… POLICIA MIL… 00001  0618… MANUTENCAO … 0100     
## 4  2017    12 5400… SEC DE ESTA… 00001  0618… MANUTENCAO … 0100     
## 5  2017    12 5205… FUNDO ESTAD… 52534  2312… MANUTENCAO … 0100     
## 6  2017    11 5400… POLICIA CIV… 00001  0618… MANUTENCAO … 0100     
## # ... with 36 more variables: DESCRICAO_FONTE_MAE <chr>, FONTE <chr>,
## #   DESCRICAO_FONTE <chr>, PI <chr>, CODIGO_FAVORECIDO <chr>,
## #   NOME_FAVORECIDO <chr>, NATUREZA1 <int>, DESCRICAO_NATUREZA1 <chr>,
## #   NATUREZA2 <int>, DESCRICAO_NATUREZA2 <chr>, NATUREZA3 <int>,
## #   DESCRICAO_NATUREZA3 <chr>, NATUREZA4 <int>, DESCRICAO_NATUREZA4 <chr>,
## #   NATUREZA5 <int>, DESCRICAO_NATUREZA5 <chr>, NATUREZA6 <int>,
## #   DESCRICAO_NATUREZA6 <chr>, NATUREZA <int>, DESCRICAO_NATUREZA <chr>,
## #   DATA_REGISTRO <date>, PROJETO_ATIVIDADE_ID <dbl>, PROGRAMA_ID <int>,
## #   SUB_FUNCAO_ID <int>, PT_FUNCAO_ID <int>, FONTE_MAE_ID <int>,
## #   FONTE_ID <dbl>, FL_DIARIA <int>, FL_FAVORECIDO <int>, SUBTITULO <int>,
## #   DESCRICAO_SUBTITULO <chr>, ORGAO <chr>, ORGAO_DESCRICAO <chr>,
## #   VALOR_EMPENHADO <dbl>, VALOR_LIQUIDADO <dbl>, VALOR_PAGO <dbl>
# tarefa: filtrar fora todas os dados que são de 2017
# em outras palavras: filtrar os dados que não são de 2017
df_despesas %>% 
  filter(ANO != 2017)
## # A tibble: 0 x 44
## # ... with 44 variables: ANO <int>, MES <int>, UG <chr>,
## #   DESCRICAO_UG <chr>, GESTAO <chr>, PT <chr>, PT_DESCRICAO <chr>,
## #   FONTE_MAE <chr>, DESCRICAO_FONTE_MAE <chr>, FONTE <chr>,
## #   DESCRICAO_FONTE <chr>, PI <chr>, CODIGO_FAVORECIDO <chr>,
## #   NOME_FAVORECIDO <chr>, NATUREZA1 <int>, DESCRICAO_NATUREZA1 <chr>,
## #   NATUREZA2 <int>, DESCRICAO_NATUREZA2 <chr>, NATUREZA3 <int>,
## #   DESCRICAO_NATUREZA3 <chr>, NATUREZA4 <int>, DESCRICAO_NATUREZA4 <chr>,
## #   NATUREZA5 <int>, DESCRICAO_NATUREZA5 <chr>, NATUREZA6 <int>,
## #   DESCRICAO_NATUREZA6 <chr>, NATUREZA <int>, DESCRICAO_NATUREZA <chr>,
## #   DATA_REGISTRO <date>, PROJETO_ATIVIDADE_ID <dbl>, PROGRAMA_ID <int>,
## #   SUB_FUNCAO_ID <int>, PT_FUNCAO_ID <int>, FONTE_MAE_ID <int>,
## #   FONTE_ID <dbl>, FL_DIARIA <int>, FL_FAVORECIDO <int>, SUBTITULO <int>,
## #   DESCRICAO_SUBTITULO <chr>, ORGAO <chr>, ORGAO_DESCRICAO <chr>,
## #   VALOR_EMPENHADO <dbl>, VALOR_LIQUIDADO <dbl>, VALOR_PAGO <dbl>
# filtros baseados em multiplas colunas
df_despesas %>% filter(str_detect(DESCRICAO_UG, "POLICIA"),
                       MES == 1,
                       VALOR_EMPENHADO == 0)
## # A tibble: 2 x 44
##     ANO   MES UG    DESCRICAO_UG GESTAO PT    PT_DESCRICAO FONTE_MAE
##   <int> <int> <chr> <chr>        <chr>  <chr> <chr>        <chr>    
## 1  2017     1 5400… POLICIA CIV… 00001  0618… MANUTENCAO … 0100     
## 2  2017     1 5400… POLICIA CIV… 00001  0618… MANUTENCAO … 0100     
## # ... with 36 more variables: DESCRICAO_FONTE_MAE <chr>, FONTE <chr>,
## #   DESCRICAO_FONTE <chr>, PI <chr>, CODIGO_FAVORECIDO <chr>,
## #   NOME_FAVORECIDO <chr>, NATUREZA1 <int>, DESCRICAO_NATUREZA1 <chr>,
## #   NATUREZA2 <int>, DESCRICAO_NATUREZA2 <chr>, NATUREZA3 <int>,
## #   DESCRICAO_NATUREZA3 <chr>, NATUREZA4 <int>, DESCRICAO_NATUREZA4 <chr>,
## #   NATUREZA5 <int>, DESCRICAO_NATUREZA5 <chr>, NATUREZA6 <int>,
## #   DESCRICAO_NATUREZA6 <chr>, NATUREZA <int>, DESCRICAO_NATUREZA <chr>,
## #   DATA_REGISTRO <date>, PROJETO_ATIVIDADE_ID <dbl>, PROGRAMA_ID <int>,
## #   SUB_FUNCAO_ID <int>, PT_FUNCAO_ID <int>, FONTE_MAE_ID <int>,
## #   FONTE_ID <dbl>, FL_DIARIA <int>, FL_FAVORECIDO <int>, SUBTITULO <int>,
## #   DESCRICAO_SUBTITULO <chr>, ORGAO <chr>, ORGAO_DESCRICAO <chr>,
## #   VALOR_EMPENHADO <dbl>, VALOR_LIQUIDADO <dbl>, VALOR_PAGO <dbl>

1.4.3 mutate()

mutate() serve para criar novas colunas que são funções de colunas já existentes no dataframe

# criar dataset menor para servir de exemplo
df_menor <- df_despesas %>% 
  select(DESCRICAO_UG, CODIGO_FAVORECIDO, NOME_FAVORECIDO, DATA_REGISTRO,
         VALOR_EMPENHADO, VALOR_LIQUIDADO, VALOR_PAGO) %>% 
  head(10)

df_menor
## # A tibble: 10 x 7
##    DESCRICAO_UG CODIGO_FAVORECI… NOME_FAVORECIDO DATA_REGISTRO
##    <chr>        <chr>            <chr>           <date>       
##  1 UNIVERS EST… PF0000001        FOLHA PAGTO.PE… 2017-11-30   
##  2 UNIVERS EST… PF0000001        FOLHA PAGTO.PE… 2017-11-30   
##  3 SEC DE ESTA… 07244008000304   EYES NWEHERE S… 2017-12-22   
##  4 SEC DE ESTA… 24472748000155   EQUILIBRIO SER… 2017-07-10   
##  5 SEC DE ESTA… 06536764412      SAMUEL JACKSON… 2017-06-23   
##  6 POLICIA MIL… 04834392000145   BRASCAR LOCADO… 2017-10-18   
##  7 SEC DE ESTA… 08445586483      JOSE RODRIGO D… 2017-05-16   
##  8 DEPARTAM DE… 35034750449      JOSE CICERO GO… 2017-07-14   
##  9 SEC DE ESTA… 12498937000118   SOPROBEM SERV … 2017-07-11   
## 10 SEC DE ESTA… 02558157001215   TELEFONICA DO … 2017-07-14   
## # ... with 3 more variables: VALOR_EMPENHADO <dbl>, VALOR_LIQUIDADO <dbl>,
## #   VALOR_PAGO <dbl>
# tarefa: criar nova coluna com o dia do registro
df_menor %>% 
  mutate(DIA_REGISTRO = lubridate::day(DATA_REGISTRO)) %>% 
  select(DATA_REGISTRO, DIA_REGISTRO) 
## # A tibble: 10 x 2
##    DATA_REGISTRO DIA_REGISTRO
##    <date>               <int>
##  1 2017-11-30              30
##  2 2017-11-30              30
##  3 2017-12-22              22
##  4 2017-07-10              10
##  5 2017-06-23              23
##  6 2017-10-18              18
##  7 2017-05-16              16
##  8 2017-07-14              14
##  9 2017-07-11              11
## 10 2017-07-14              14
# tarefa: criar varias colunas de resultados de equações simples
df_menor %>% 
  mutate(VALOR_PAGO_RAIZ_2 = sqrt(VALOR_PAGO),
         valor_pago_quadrado = VALOR_PAGO^2,
         valor_pago_dobro = VALOR_PAGO*2,
         valor_pago_arredondado = round(VALOR_PAGO),
         valor_pago_soma = VALOR_PAGO + VALOR_EMPENHADO + VALOR_LIQUIDADO) %>% 
  select(contains("valor_pago", ignore.case = TRUE))
## # A tibble: 10 x 6
##    VALOR_PAGO VALOR_PAGO_RAIZ… valor_pago_quad… valor_pago_dobro
##         <dbl>            <dbl>            <dbl>            <dbl>
##  1     25557.            160.        653166894.           51114.
##  2     36652.            191.       1343358841.           73304.
##  3     78990.            281.       6239341110.          157979 
##  4         0               0                 0                0 
##  5         0               0                 0                0 
##  6         0               0                 0                0 
##  7       133.             11.5           17777.             267.
##  8       300              17.3           90000              600 
##  9     83773.            289.       7017970819.          167547.
## 10       949.             30.8          901436.            1899.
## # ... with 2 more variables: valor_pago_arredondado <dbl>,
## #   valor_pago_soma <dbl>
# tarefa: extrair primeiro nome da coluna NOME_FAVORECIDO
df_menor %>% 
  mutate(primeiro_nome = stringr::word(NOME_FAVORECIDO, 1)) %>% 
  select(NOME_FAVORECIDO, primeiro_nome)
## # A tibble: 10 x 2
##    NOME_FAVORECIDO                               primeiro_nome
##    <chr>                                         <chr>        
##  1 FOLHA PAGTO.PESSOAL                           FOLHA        
##  2 FOLHA PAGTO.PESSOAL                           FOLHA        
##  3 EYES NWEHERE SIST INTELIGENTES DE IMAGEM LTDA EYES         
##  4 EQUILIBRIO SERVICOS LTDA - ROTACAR LOCADORA   EQUILIBRIO   
##  5 SAMUEL JACKSON OLIVEIRA DE LIMA               SAMUEL       
##  6 BRASCAR LOCADORA LTDA                         BRASCAR      
##  7 JOSE RODRIGO DOS SANTOS NUNES                 JOSE         
##  8 JOSE CICERO GOMES DA SILVA                    JOSE         
##  9 SOPROBEM SERV PROM E BEM ESTAR COMUNITARIO    SOPROBEM     
## 10 TELEFONICA DO BRASIL S.A.                     TELEFONICA
# tarefa: converter coluna NOME_FAVORECIDO para minusculo,
# com exceção da primeira letra de cada palavra
df_menor %>% 
  mutate(NOME_FAVORECIDO = stringr::str_to_title(NOME_FAVORECIDO)) %>% 
  select(NOME_FAVORECIDO)
## # A tibble: 10 x 1
##    NOME_FAVORECIDO                              
##    <chr>                                        
##  1 Folha Pagto.pessoal                          
##  2 Folha Pagto.pessoal                          
##  3 Eyes Nwehere Sist Inteligentes De Imagem Ltda
##  4 Equilibrio Servicos Ltda - Rotacar Locadora  
##  5 Samuel Jackson Oliveira De Lima              
##  6 Brascar Locadora Ltda                        
##  7 Jose Rodrigo Dos Santos Nunes                
##  8 Jose Cicero Gomes Da Silva                   
##  9 Soprobem Serv Prom E Bem Estar Comunitario   
## 10 Telefonica Do Brasil S.a.

1.4.4 arrange()

arrange() muda a posição das linhas do dataframe baseado em uma ou mais colunas, em ordem crescente ou decrescente É como o classificar do Excel.

# classificar tabela de acordo com a ordem crescente da coluna NOME_FAVORECIDO
df_menor %>% 
  arrange(NOME_FAVORECIDO)
## # A tibble: 10 x 7
##    DESCRICAO_UG CODIGO_FAVORECI… NOME_FAVORECIDO DATA_REGISTRO
##    <chr>        <chr>            <chr>           <date>       
##  1 POLICIA MIL… 04834392000145   BRASCAR LOCADO… 2017-10-18   
##  2 SEC DE ESTA… 24472748000155   EQUILIBRIO SER… 2017-07-10   
##  3 SEC DE ESTA… 07244008000304   EYES NWEHERE S… 2017-12-22   
##  4 UNIVERS EST… PF0000001        FOLHA PAGTO.PE… 2017-11-30   
##  5 UNIVERS EST… PF0000001        FOLHA PAGTO.PE… 2017-11-30   
##  6 DEPARTAM DE… 35034750449      JOSE CICERO GO… 2017-07-14   
##  7 SEC DE ESTA… 08445586483      JOSE RODRIGO D… 2017-05-16   
##  8 SEC DE ESTA… 06536764412      SAMUEL JACKSON… 2017-06-23   
##  9 SEC DE ESTA… 12498937000118   SOPROBEM SERV … 2017-07-11   
## 10 SEC DE ESTA… 02558157001215   TELEFONICA DO … 2017-07-14   
## # ... with 3 more variables: VALOR_EMPENHADO <dbl>, VALOR_LIQUIDADO <dbl>,
## #   VALOR_PAGO <dbl>
# fazer o mesmo que acima, mas usando ordem decrescente
df_menor %>% 
  arrange(desc(NOME_FAVORECIDO))
## # A tibble: 10 x 7
##    DESCRICAO_UG CODIGO_FAVORECI… NOME_FAVORECIDO DATA_REGISTRO
##    <chr>        <chr>            <chr>           <date>       
##  1 SEC DE ESTA… 02558157001215   TELEFONICA DO … 2017-07-14   
##  2 SEC DE ESTA… 12498937000118   SOPROBEM SERV … 2017-07-11   
##  3 SEC DE ESTA… 06536764412      SAMUEL JACKSON… 2017-06-23   
##  4 SEC DE ESTA… 08445586483      JOSE RODRIGO D… 2017-05-16   
##  5 DEPARTAM DE… 35034750449      JOSE CICERO GO… 2017-07-14   
##  6 UNIVERS EST… PF0000001        FOLHA PAGTO.PE… 2017-11-30   
##  7 UNIVERS EST… PF0000001        FOLHA PAGTO.PE… 2017-11-30   
##  8 SEC DE ESTA… 07244008000304   EYES NWEHERE S… 2017-12-22   
##  9 SEC DE ESTA… 24472748000155   EQUILIBRIO SER… 2017-07-10   
## 10 POLICIA MIL… 04834392000145   BRASCAR LOCADO… 2017-10-18   
## # ... with 3 more variables: VALOR_EMPENHADO <dbl>, VALOR_LIQUIDADO <dbl>,
## #   VALOR_PAGO <dbl>
# mostrar datas onde houve os maiores valores de despesa com folha de pagamento
df_despesas %>% 
  filter(NOME_FAVORECIDO == "FOLHA PAGTO.PESSOAL") %>% 
  select(DATA_REGISTRO, VALOR_PAGO) %>% 
  arrange(desc(VALOR_PAGO))
## # A tibble: 10,285 x 2
##    DATA_REGISTRO VALOR_PAGO
##    <date>             <dbl>
##  1 2017-06-30     36199947.
##  2 2017-07-31     36197178.
##  3 2017-05-31     35974835.
##  4 2017-01-31     35902479.
##  5 2017-09-30     35538295.
##  6 2017-12-15     35507190.
##  7 2017-08-30     35505462.
##  8 2017-02-28     35393811.
##  9 2017-10-31     35249901.
## 10 2017-03-31     35149377.
## # ... with 10,275 more rows
# classificar dados pelo NOME_FAVORECIDO, mostrando os maiores valores pagos para cada
df_despesas %>% 
  select(DATA_REGISTRO, NOME_FAVORECIDO, VALOR_PAGO) %>% 
  arrange(NOME_FAVORECIDO, desc(VALOR_PAGO))
## # A tibble: 192,638 x 3
##    DATA_REGISTRO NOME_FAVORECIDO                             VALOR_PAGO
##    <date>        <chr>                                            <dbl>
##  1 2017-07-26    13  SUPERINTENDENCIA REGIONAL DE POL. ROD.        766.
##  2 2017-09-19    13  SUPERINTENDENCIA REGIONAL DE POL. ROD.        156.
##  3 2017-07-26    13  SUPERINTENDENCIA REGIONAL DE POL. ROD.          0 
##  4 2017-10-20    1 REGISTRO G. DE IMOVEIS E HIPOTECA MACEIO.      8849.
##  5 2017-09-29    1 REGISTRO G. DE IMOVEIS E HIPOTECA MACEIO.         0 
##  6 2017-10-05    1 REGISTRO G. DE IMOVEIS E HIPOTECA MACEIO.         0 
##  7 2017-10-30    3D INFORMATIC SERVICOS LTDA                         0 
##  8 2017-10-30    3D INFORMATIC SERVICOS LTDA                         0 
##  9 2017-04-25    3D INFORMATIC SERVICOS LTDA                         0 
## 10 2017-04-25    3D INFORMATIC SERVICOS LTDA                         0 
## # ... with 192,628 more rows

1.4.5 group_by() e summarise()

O combo group_by() e summarise() é excelente para agregar e resumir dados. Com group_by(), as funções aplicadas com summarise() ou até mesmo com mutate() ou filter() são aplicadas não em todo o dataset mas sim em cada grupo da variável especificada na função group_by

# calcular o valor medio pago agrupado por DESCRICAO_UG
df_despesas %>% 
  group_by(DESCRICAO_UG) %>% 
  summarise(VALOR_PAGO_MEDIO = mean(VALOR_PAGO))
## # A tibble: 80 x 2
##    DESCRICAO_UG                                  VALOR_PAGO_MEDIO
##    <chr>                                                    <dbl>
##  1 AG DE MODERNIZACAO DA GESTAO DE PROCESSOS               18098.
##  2 AGENC DE DEFESA E INSPECAO AGROPECUARIA DE AL            5041.
##  3 AGENCIA DE FOMENTO DE ALAGOAS                            2382.
##  4 AGENCIA REGULADORA DOS SERV PUB DO EST DE AL             4068.
##  5 ALAGOAS PREVIDENCIA                                     18652.
##  6 ASSEMBLEIA LEGISLATIVA ESTADUAL                        252891.
##  7 CIA DE ADMINIST DE REC HUMANOS E PATRIMONIAIS           24303.
##  8 CONTROLADORIA GERAL DO ESTADO                            6372.
##  9 COORDENADORIA ESTADUAL DE DEFESA CIVIL CEDEC            17926.
## 10 CORPO DE BOMBEIROS MILITAR DO ESTADO DE AL              64719.
## # ... with 70 more rows
# Calcular a soma do valor pago, a quantidade de registros e...
# a quantidade de favorecidos disintos para cada UG.
# classificar pela qtd de favorecidos distintos em ordem decrescente
df_despesas %>% 
  group_by(DESCRICAO_UG) %>% 
  summarise(VALOR_PAGO_TOTAL = sum(VALOR_PAGO),
            QTD_OBSERVACOES = n(),
            QTD_FAVORECIDOS_DIFERENTES = n_distinct(CODIGO_FAVORECIDO)) %>% 
  arrange(desc(QTD_FAVORECIDOS_DIFERENTES))
## # A tibble: 80 x 4
##    DESCRICAO_UG        VALOR_PAGO_TOTAL QTD_OBSERVACOES QTD_FAVORECIDOS_D…
##    <chr>                          <dbl>           <int>              <int>
##  1 SEC DE ESTADO DA S…        88281789.           11586               1850
##  2 SECRETARIA DE ESTA…       688386057.           21800               1530
##  3 UNIVERS ESTADUAL D…       218302840.           23790               1377
##  4 FUNDO ESTADUAL DE …       250232390.            5014                738
##  5 SECRETARIA DE ESTA…       656421639.            5734                681
##  6 POLICIA CIVIL DO E…       263251822.            9275                579
##  7 INSTITUTO DO MEIO …        13245505.            7800                444
##  8 FUN DE AMPARO A PE…        20997494.            2745                441
##  9 TRIBUNAL DE JUSTICA       446800776.            2843                432
## 10 POLICIA MILITAR DO…       641422440.            3105                392
## # ... with 70 more rows
# calcular a soma de todas as variáveis que começam com valor por ano e mês...
# apenas para o UG "ALAGOAS PREVIDENCIA"
df_despesas %>% 
  filter(DESCRICAO_UG == "ALAGOAS PREVIDENCIA") %>% 
  group_by(ANO, MES) %>% 
  summarise_at(vars(contains("VALOR_")), sum)
## # A tibble: 11 x 5
## # Groups:   ANO [?]
##      ANO   MES VALOR_EMPENHADO VALOR_LIQUIDADO VALOR_PAGO
##    <int> <int>           <dbl>           <dbl>      <dbl>
##  1  2017     2        1426284.        1303068.   1303068.
##  2  2017     3        1504915.        1107573.    865426.
##  3  2017     4        1475190.        1619974.   1839362.
##  4  2017     5        1349917.        1511101.   1323909.
##  5  2017     6        1375101.        1411114.   1411114.
##  6  2017     7        1729151.        1739711.   1713611.
##  7  2017     8        2039230.        1041208.   1251158.
##  8  2017     9        1072202.        1749638.   1739718.
##  9  2017    10        1139471.        1349006.   1354523.
## 10  2017    11        1853057.        1214717.   1232741.
## 11  2017    12       18273418.       19190829.  16983302.
# count() é uma alternativa a group_by() + summarise(n())

df_despesas %>% 
  count(CODIGO_FAVORECIDO, NOME_FAVORECIDO) %>% 
  filter(n > 100) %>% 
  arrange(desc(n))
## # A tibble: 125 x 3
##    CODIGO_FAVORECIDO NOME_FAVORECIDO                                 n
##    <chr>             <chr>                                       <int>
##  1 PF0000001         FOLHA PAGTO.PESSOAL                         10285
##  2 29979036000221    INSS - INSTITUTO NACIONAL DO SEGURO SOCIAL   3553
##  3 13353495000184    PROPAG TURISMO LTDA                          2452
##  4 12272084000100    COMPANHIA ENERGETICA DE ALAGOAS - CEAL       1304
##  5 24472748000155    EQUILIBRIO SERVICOS LTDA - ROTACAR LOCADORA  1292
##  6 PF0000002         DIVIDA/AJUS. FISCAL                           991
##  7 33000118001302    TELEMAR NORTE LESTE S.A                       922
##  8 PF0000006         INATIVOS E PENSIONI                           889
##  9 12272084000100    CIA EDE ELETRICA DE ALAGOAS                   883
## 10 05423963000111    OI MOVEL S/A                                  848
## # ... with 115 more rows

1.5 Juntando duas tabelas em uma

Em muitas situações durante uma análise de dados, é comum trabalhar com mais de uma tabela, sendo assim necessário usar ferramentas para as combinar em uma tabela só. Para quem vem do Excel, é algo similar ao que faz o PROCV ou VLOOKUP.

O dplyr oferece várias funções para realizar a junção de duas tabelas, que são a familía x_join(). Todas seguem a mesma sintaxe: x_join(x, y, by), onde x e y são os dois dataframes a serem juntados e by é um vetor de caracteres especificando a coluna que será usada como chave.

Abaixo, criamos dois datafremes simples para demonstrar o uso de duas operações de juntar tabelas: left_join(), inner_join() e full_join(). Todas as funções possuem a sintaxe:

vendedor <- tibble(
  id = c("A12", "A13", "A14", "A15"),
  regiao = c("Sul", "Sudeste", "Oeste", "Norte"),
  experiencia = c(5, 2, 12, 8)
)

vendas = tibble(
  id = c("A13", "A14", "A12", "A11"),
  vendas = c(1200, 2500, 350, 1000)
)

vendedor
## # A tibble: 4 x 3
##   id    regiao  experiencia
##   <chr> <chr>         <dbl>
## 1 A12   Sul               5
## 2 A13   Sudeste           2
## 3 A14   Oeste            12
## 4 A15   Norte             8
vendas
## # A tibble: 4 x 2
##   id    vendas
##   <chr>  <dbl>
## 1 A13     1200
## 2 A14     2500
## 3 A12      350
## 4 A11     1000

left_join(x, y): retorna todas as observações em x, independentemente se existem correspondentes (de acordo com as especificações em by) ou não.

left_join(vendedor, vendas, by = "id")
## # A tibble: 4 x 4
##   id    regiao  experiencia vendas
##   <chr> <chr>         <dbl>  <dbl>
## 1 A12   Sul               5    350
## 2 A13   Sudeste           2   1200
## 3 A14   Oeste            12   2500
## 4 A15   Norte             8     NA

inner_join(x, y): retornar apenas observações que correspondem tanto em x como em y. Note como o vendedor A15 não consta no dataframe final, pois ele não está presente no dataframe y:

inner_join(vendedor, vendas, by = "id")
## # A tibble: 3 x 4
##   id    regiao  experiencia vendas
##   <chr> <chr>         <dbl>  <dbl>
## 1 A12   Sul               5    350
## 2 A13   Sudeste           2   1200
## 3 A14   Oeste            12   2500

full_join(x, y) é mais completo e retorna todas as observações presentes em x e y:

full_join(vendedor, vendas, by = "id")
## # A tibble: 5 x 4
##   id    regiao  experiencia vendas
##   <chr> <chr>         <dbl>  <dbl>
## 1 A12   Sul               5    350
## 2 A13   Sudeste           2   1200
## 3 A14   Oeste            12   2500
## 4 A15   Norte             8     NA
## 5 A11   <NA>             NA   1000

1.6 tidyr

tidyr é outro pacote do tidyverse focado no manuseio de dados. Seu foco é transformar datasets no formato tidy, que facilita seu uso em pacotes como dplyr e ggplot2.

Confira o dataset abaixo (leia a documentação em ?economics para saber o significado das variáveis):

data("economics")
# ?economics
head(economics)
## # A tibble: 6 x 6
##   date         pce    pop psavert uempmed unemploy
##   <date>     <dbl>  <int>   <dbl>   <dbl>    <int>
## 1 1967-07-01  507. 198712    12.5     4.5     2944
## 2 1967-08-01  510. 198911    12.5     4.7     2945
## 3 1967-09-01  516. 199113    11.7     4.6     2958
## 4 1967-10-01  513. 199311    12.5     4.9     3143
## 5 1967-11-01  518. 199498    12.5     4.7     3066
## 6 1967-12-01  526. 199657    12.1     4.8     3018

Suponha que você deseja saber o valor médio dos indicadores pce, pop, psavert, uempmed, e unemploy para cada ano. Usando o que já aprendemos com o dplyr, podemos fazer assim:

economics %>% 
  # criar nova variavel com o ano da data
  mutate(ano = lubridate::year(date)) %>% 
  # agrupar os dados por ano
  group_by(ano) %>% 
  # calcular as medias de todas as variaveis
  summarise(
    pce = mean(pce),
    pop = mean(pop),
    psavert  = mean(psavert),
    uempmed = mean(uempmed),
    unemploy = mean(unemploy)
  ) %>% 
  head()
## # A tibble: 6 x 6
##     ano   pce     pop psavert uempmed unemploy
##   <dbl> <dbl>   <dbl>   <dbl>   <dbl>    <dbl>
## 1  1967  515. 199200.    12.3    4.7     3012.
## 2  1968  557. 200664.    11.2    4.5     2797.
## 3  1969  604. 202649.    10.7    4.44    2830.
## 4  1970  648. 204982.    12.6    4.98    4127.
## 5  1971  701  207589.    13.3    6.28    5022.
## 6  1972  769. 209838.    12.1    6.11    4876.

E se tivéssemos centenas de colunas? E se quisermos plotar todas essas variáveis em um gráfico de linha? Isso demandaria muito código manual. Esse é um exemplo onde transformar os dados em um formato tidy é benéfico.

Para isso, usamos a função gather, que precisa de três argumentos:

  • O conjunto de colunas que serão transformadas de colunas para linhas;
  • O nome da variável (coluna) cujos valores serão as colunas transformadas acima;
  • O nome da variável cujos valores serão os valores correspondentes das colunas transformadas;

Observe o exemplo abaixo:

economics %>% 
  gather(indicador, valor, -date)
## # A tibble: 2,870 x 3
##    date       indicador valor
##    <date>     <chr>     <dbl>
##  1 1967-07-01 pce        507.
##  2 1967-08-01 pce        510.
##  3 1967-09-01 pce        516.
##  4 1967-10-01 pce        513.
##  5 1967-11-01 pce        518.
##  6 1967-12-01 pce        526.
##  7 1968-01-01 pce        532.
##  8 1968-02-01 pce        534.
##  9 1968-03-01 pce        545.
## 10 1968-04-01 pce        545.
## # ... with 2,860 more rows

Com isso, nós transformamos um dataset de um formato wide (menos linhas e mais colunas) em um formato long (mais linhas e menos colunas), que está no formato ideal para ser usado com a suíte de pacotes tidyverse, entre eles o ggplot2.

Em algumas situações, porém, será necessário fazer o contrário: transformar o dataset de long para wide. Para isso, usa-se a função spread():

data("economics_long")
head(economics_long)
## # A tibble: 6 x 4
## # Groups:   variable [1]
##   date       variable value  value01
##   <date>     <fct>    <dbl>    <dbl>
## 1 1967-07-01 pce       507. 0       
## 2 1967-08-01 pce       510. 0.000266
## 3 1967-09-01 pce       516. 0.000764
## 4 1967-10-01 pce       513. 0.000472
## 5 1967-11-01 pce       518. 0.000918
## 6 1967-12-01 pce       526. 0.00158
economics_long %>% 
  select(-value01) %>% 
  spread(variable, value, fill = NA)
## # A tibble: 574 x 6
##    date         pce    pop psavert uempmed unemploy
##    <date>     <dbl>  <dbl>   <dbl>   <dbl>    <dbl>
##  1 1967-07-01  507. 198712    12.5     4.5     2944
##  2 1967-08-01  510. 198911    12.5     4.7     2945
##  3 1967-09-01  516. 199113    11.7     4.6     2958
##  4 1967-10-01  513. 199311    12.5     4.9     3143
##  5 1967-11-01  518. 199498    12.5     4.7     3066
##  6 1967-12-01  526. 199657    12.1     4.8     3018
##  7 1968-01-01  532. 199808    11.7     5.1     2878
##  8 1968-02-01  534. 199920    12.2     4.5     3001
##  9 1968-03-01  545. 200056    11.6     4.1     2877
## 10 1968-04-01  545. 200208    12.2     4.6     2709
## # ... with 564 more rows

1.7 Exercícios

  1. Carregue os pacotes tidyverse e janitor.

  2. Baixe o dataset de Super Heróis do Kaggle. Descompacte o arquivo e importe os dois arquivos para o R: salve o arquivo super_hero_powers.csv no objeto hero_powers e o arquivo heroes_information.csv no objeto hero_info. Use também na função read_csv o argumento na = c("", "-", "NA")) para que linhas com traço ou vazias sejam convertidas para NA. Observe as colunas presentes nos datasets usando a função glimpse.

  3. Use a função janitor::clean_names() para limpar os nomes das colunas.

  4. No caso de hero_info, remova a primeira coluna.

  5. Em hero_powers, converta todas as colunas com exceção da primeira para o tipo logical.

  6. Em hero_info, na coluna publisher, observe quantas editoras diferentes existem no dataset. Substitua Marvel Comics por Marvel, DC Comics por DC e todas as outras editoras pelo termo “Outros”. Dica: uma das possíveis maneiras de fazer isso é usando uma combinação das funções dplyr::mutate() e dplyr::case_when().

  7. Em hero_info, quais raças (coluna race) são exclusivas de cada editora?

  8. Em hero_info, quais cores de olhos (coluna eye_color) são mais comuns para cada sexo (coluna gender)? Filtre o top 3 para cadda sexo.

  9. Em hero_powers, calcule o percentual de heróis que possui cada habilidade descrita nas colunas (Dica: é possível calcular a soma ou percentual de um vetor lógico, pois TRUE equivale a 1 e FALSE a 0). Use a função dplyr::summarise_if para aplicar a função em todas as colunas cuja classe é logical.

  10. Repita o item anterior, usando uma abordagem mais tidy: converta o formato do dataframe hero_powers para o formato long. Ele passará a possuir apenas 3 colunas: hero_names, poder e possui_poder usando a função tidyr::gather(). Então, calcule a média da coluna possui_poder agrupado pela coluna poder.

  11. Junte os dois dataframes em um só, chamado hero. A função a ser usada é inner_join(). Pense bem em qual será a ordem dos dataframes nos argumentos da função e qual será a chave usada no argumento by para unir as duas tabelas.

  12. No dataframe hero, calcule o percentual de herois de cada editora que são telepatas.

  13. No dataframe hero, selecione as colunas name, publisher, flight e weight, filtre os heróis que podem voar e retorne os 10 de maior peso.

  14. Salve o dataframe chamado hero no arquivo herois_completo.csv usando a função readr::write_csv().