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
Referências:
Documentação do pacote readr
Documentação do pacote readxl
, ideal para ler arquivos de Excel.
Capítulo “Lendo os dados” do livro Ciência de Dados com R
Capítulo “Data import” do livro R for Data Science
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:
Referências:
Site oficial do pacote dplyr
Capítulo “Manipulando os dados” do livro Ciência de Dados com R
Capítulo “Data transformation” do livro R for Data Science Documentação do pacote dplyr
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
Referências:
Documentação da função select()
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>
Referências:
Documentação da função filter()
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.
Referências:
Documentação da função mutate()
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
Referências:
Documentação da função arrange()
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
Carregue os pacotes
tidyverse
ejanitor
.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 objetohero_powers
e o arquivoheroes_information.csv
no objetohero_info
. Use também na funçãoread_csv
o argumentona = c("", "-", "NA"))
para que linhas com traço ou vazias sejam convertidas para NA. Observe as colunas presentes nos datasets usando a funçãoglimpse
.Use a função
janitor::clean_names()
para limpar os nomes das colunas.No caso de
hero_info
, remova a primeira coluna.Em
hero_powers
, converta todas as colunas com exceção da primeira para o tipological
.Em
hero_info
, na colunapublisher
, 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çõesdplyr::mutate()
edplyr::case_when()
.Em
hero_info
, quais raças (colunarace
) são exclusivas de cada editora?Em
hero_info
, quais cores de olhos (colunaeye_color
) são mais comuns para cada sexo (colunagender
)? Filtre o top 3 para cadda sexo.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, poisTRUE
equivale a 1 eFALSE
a 0). Use a funçãodplyr::summarise_if
para aplicar a função em todas as colunas cuja classe élogical
.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
epossui_poder
usando a funçãotidyr::gather()
. Então, calcule a média da colunapossui_poder
agrupado pela colunapoder
.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 argumentoby
para unir as duas tabelas.No dataframe
hero
, calcule o percentual de herois de cada editora que são telepatas.No dataframe
hero
, selecione as colunasname
,publisher
,flight
eweight
, filtre os heróis que podem voar e retorne os 10 de maior peso.Salve o dataframe chamado
hero
no arquivoherois_completo.csv
usando a funçãoreadr::write_csv()
.