alt text

GET00183 - Visualização de Dados

Jony Arrais Pinto Junior

1 - Preparação de dados

Para que possamos construir uma boa visualização de dados, precisamos inicialmente conseguir trabalhar/manipular os dados no nosso ambiente de trabalho (R). Estamos falando principalmente sobre importação e “limpeza” de dados.

2 - Pipe (Ctrl + Shift + m)

Para as análises realizadas ao longo do curso, uma ferramenta útil e importante será o operador pipe. Então antes de falarmos sobre importação e limpeza de dados, iremos apresentar o operador.

Pipes são ferramentas extremamente poderosas para clarear (decodificar) uma sequência de múltiplas operações.

Podemos apontar o operador pipe como uma das grandes revoluções dos último tempos no R, pois torna a leitura de uma sequência de códigos muito mais lógica, fácil e compreensível.

O |> é um operador nativo do R, que encontraremos disponível a partir da versão 4.1.

Basicamente, o operador |> usa o resultado do seu lado esquerdo como primeiro argumento da função do lado direito. Só isso!!!

No código abaixo, para termos acesso ao |> vamos carregar o pacote tidyverse (que carrega diversos pacotes).

#Criando um vetor x
x = c(2, 5, 7, 1, 8, 3)

#Calculando a média dos elementos de x com 2 casas decimais
x |> 
  mean() |> 
  round(digits = 2)
[1] 4.33

Com o código descrito acima, enviamos o objeto x como o primeiro argumento da função mean e, em seguida, enviamos o resultado da expressão mean(x) como o primeiro argumento da função round, que diferentemente da função mean, necessita de dois argumentos, o valor a ser arredondado e o número de casas decimais, no caso digits = 2.

Mas qual foi o ganho? Se escrevermos os comandos na forma usual temos:

#Calculando a media de x com 2 casas decimais na forma usual
round(x = mean(x), digits = 2)
[1] 4.33

Aparentemente, o ganho não foi grande. Agora pense que precisamos executar 10 funções aninhadas! O uso do |> vai permitir transformar um código confuso e difícil em algo simples e intuitivo.

Retiramos o exemplo abaixo do site curso-r, e ele se refere a seguinte situação problema: “vamos imaginar que precisamos escrever uma receita de um bolo usando o R, e cada passo da receita é uma função”:

#Receita do bolo
esfrie(asse(coloque(bata(acrescente(recipiente(rep("farinha", 2), "água", "fermento", "leite", "óleo"), "farinha", ate = "macio"), duracao = "3min"), lugar = "forma", tipo = "grande", untada = TRUE), duracao = "50min"), "geladeira", "20min")

Entenderam????? Imaginamos que não!

|> no código:

#Receita do bolo com |>
recipiente(rep("farinha", 2), "água", "fermento", "leite", "óleo") |>
  acrescente("farinha", ate = "macio") |>
  bata(duracao = "3min") |>
  coloque(lugar = "forma", tipo = "grande", untada = T) |>
  asse(duracao = "50min") |>
  esfrie("geladeira", "20min")

Agora o código realmente parece uma receita de bolo, certo?

Para ativar o atalho Ctrl + Shift + m no Windows ou Cmd + Shift + m no Mac, precisamos ativar esta opção. Vá em Tools > Global Options > Code e ative a caixa como especificado abaixo (é preciso ter uma versão igual ou superior a 4.1 do R):

Aqueles que forem usuários do |> do pacote magrittr, perceberam que existe grande semelhança entre o operador pipe nativo da linguagem com o pipe do pacote. Existem sim algumas diferenças, que não irei abordar agora. Para aqueles que estiverem conhecendo o operador pipe pela primeira vez, sugiro fortemente o uso do pipe nativo |>.

3 - Importando dados para o R

3.1 - Pacote readr

alt text

O pacote readr possui uma série de funções para importar arquivos em data frames no R. Esse pacote pertence ao universo tidyverse e suas funções devem ser preferidas as funções bases do R.

As principais funções deste pacote para importação de dados são:

  • read_table2 - importa arquivos em que as colunas são separadas por espaços em branco. É equivalente a read.table, permite qualquer número de espaços entre colunas.
  • read_table - é similar a read_table2, porém é mais rigorosa, cada linha deve ter o mesmo cumprimento e cada campo está na mesma posição em todas as linhas.
  • read_csv - importa aquivos delimitados por vírgula.
  • read_csv2 - importa arquivos separados por semicolunas (comum em países que usam a “,” como separador decimal)
  • read_tsv - importa arquivos separados por tabs.
  • read_delim - importa arquivos com larguras fixas.

A seguir, vamos apresentar os principais argumentos da função read_table2:

  - file - o arquivo a ser importado;

  - col_names - um argumento lógico indicando se o arquivo possui ou não os nomes das variáveis (default = TRUE);

  - na - qual a codificação usada para dado faltante (default = NA);

  - skip - número de linhas a serem puladas no momento da importação (default = 0);

  - locale - controla vários aspectos como decimal, enconding, entre outros.

Após especificarmos a pasta de trabalho, basta utilizarmos a função read_table2 como a seguir.

#Carregando o pacote
library(readr)

#Importando o arquivo Base saude.txt e guardando no objeto base_saude
base_saude = read_table2(file = "Base saude.txt")

── Column specification ────────────────────────────────────────────────────────
cols(
  Codigo = col_character(),
  Datacol = col_character(),
  Sexo = col_double(),
  Idade = col_double(),
  Peso = col_number(),
  Estatura = col_number(),
  HIV = col_double(),
  Escol = col_double(),
  DST = col_double(),
  Tipo = col_double()
)
#Visualizando o objeto base_saude
base_saude
# A tibble: 200 x 10
   Codigo Datacol   Sexo Idade  Peso Estatura   HIV Escol   DST  Tipo
   <chr>  <chr>    <dbl> <dbl> <dbl>    <dbl> <dbl> <dbl> <dbl> <dbl>
 1 AB01   14/10/15     1    20   612       16     1     3     1     2
 2 AB02   09/02/16     0    30    60      155     0     5     0     9
 3 AB03   01/03/10     0    50    80      183     1     2     1     3
 4 AB04   04/05/13     0    43    83       19     1     9     1     2
 5 AB05   20/05/14     0    22   753      175     0     2     1     3
 6 AB06   30/01/11     1    15   702       17     1     6     0     9
 7 AB07   05/08/15     1    22    60      165     1     5     1     3
 8 AB08   08/12/13     1    25    62      155     0     1     0     2
 9 AB09   03/11/10     1    32    61      162     1     4     1     1
10 AB10   10/10/10     1    33    55      155     1     5     1     9
# … with 190 more rows

Ao usarmos as funções do pacote readr para importarmos arquivo, a primeira coisa que percebemos é que são apresentadas a forma como cada variável foi coletada. Ao pedirmos para visualizarmos o objeto, percebemos que ele é um tibble.

  • A importação foi realizada de maneira correta?

  • Avaliem a variável Peso e Estatura no arquivo original. O que tem de diferente dos valores apresentados na tela do R?

Suponham que o responsável pela digitação dos dados nos informou que ele utilizou o código 9 como dado faltante.

Isso significa que precisamos modificar alguns argumentos da função para que a mesma possa realizar a importação de forma adequada, considerando o 9 como dado faltante e a “,” como decimal.

#Visualizando os argumentos da função locale
args(locale)
function (date_names = "en", date_format = "%AD", time_format = "%AT", 
    decimal_mark = ".", grouping_mark = ",", tz = "UTC", encoding = "UTF-8", 
    asciify = FALSE) 
NULL
#Importando o arquivo Base saude.txt
base_saude = read_table2(file = "Base saude.txt", 
                         na = "9", 
                         locale = locale(decimal_mark = ","))

── Column specification ────────────────────────────────────────────────────────
cols(
  Codigo = col_character(),
  Datacol = col_character(),
  Sexo = col_double(),
  Idade = col_double(),
  Peso = col_double(),
  Estatura = col_double(),
  HIV = col_double(),
  Escol = col_double(),
  DST = col_double(),
  Tipo = col_double()
)
#Visualizando o objeto base_saude
base_saude
# A tibble: 200 x 10
   Codigo Datacol   Sexo Idade  Peso Estatura   HIV Escol   DST  Tipo
   <chr>  <chr>    <dbl> <dbl> <dbl>    <dbl> <dbl> <dbl> <dbl> <dbl>
 1 AB01   14/10/15     1    20  61.2     1.6      1     3     1     2
 2 AB02   09/02/16     0    30  60       1.55     0     5     0    NA
 3 AB03   01/03/10     0    50  80       1.83     1     2     1     3
 4 AB04   04/05/13     0    43  83       1.9      1    NA     1     2
 5 AB05   20/05/14     0    22  75.3     1.75     0     2     1     3
 6 AB06   30/01/11     1    15  70.2     1.7      1     6     0    NA
 7 AB07   05/08/15     1    22  60       1.65     1     5     1     3
 8 AB08   08/12/13     1    25  62       1.55     0     1     0     2
 9 AB09   03/11/10     1    32  61       1.62     1     4     1     1
10 AB10   10/10/10     1    33  55       1.55     1     5     1    NA
# … with 190 more rows

A forma com que o pacote enxergou cada variável (character, double, integer, factor) nas importações realizadas anteriormente não foram especificados pelo usuário. O pacote faz alguns testes em função dos valores observados para cada variável e define o que parece mais apropriado. Entretanto, é possível que o usuário defina o tipo da variável na importação.

Suponha que o nosso interesse seja que a variável Sexo seja um character que assume os valores 0 e 1. Podemos fazer essa definição na importação da base usando o argumento col_types.

#Importando o arquivo Base saude.txt
base_saude2 = read_table2(file = "Base saude.txt", 
                         na = "9", 
                         locale = locale(decimal_mark = ","),
                         col_types = cols(Sexo = col_character()))

#Visualizando o objeto base_saude2
base_saude2
# A tibble: 200 x 10
   Codigo Datacol  Sexo  Idade  Peso Estatura   HIV Escol   DST  Tipo
   <chr>  <chr>    <chr> <dbl> <dbl>    <dbl> <dbl> <dbl> <dbl> <dbl>
 1 AB01   14/10/15 1        20  61.2     1.6      1     3     1     2
 2 AB02   09/02/16 0        30  60       1.55     0     5     0    NA
 3 AB03   01/03/10 0        50  80       1.83     1     2     1     3
 4 AB04   04/05/13 0        43  83       1.9      1    NA     1     2
 5 AB05   20/05/14 0        22  75.3     1.75     0     2     1     3
 6 AB06   30/01/11 1        15  70.2     1.7      1     6     0    NA
 7 AB07   05/08/15 1        22  60       1.65     1     5     1     3
 8 AB08   08/12/13 1        25  62       1.55     0     1     0     2
 9 AB09   03/11/10 1        32  61       1.62     1     4     1     1
10 AB10   10/10/10 1        33  55       1.55     1     5     1    NA
# … with 190 more rows

Atividade: Agora importem o arquivo Base saude modificada.txt (suponham que ele possui as mesmas características do arquivo base saude.txt) e guardem em um objeto chamado base_saude2.

#Visualizando o objeto base_saude3
base_saude3
# A tibble: 7 x 1
  CodigotDaTaColetSexotIdadetPesotEsTaTuratHIVtEscoltDSTtTipo
  <chr>                                                      
1 AB01t14/10/15t1t20t61,2t1,6t1t3t1t2                        
2 AB02t09/02/16t0t30t60t1,55t0t5t0t9                         
3 AB03t01/03/10t0t50t80t1,83t1t2t1t3                         
4 AB04t04/05/13t0t43t83t1,9t1t9t1t2                          
5 AB05t20/05/14t0t22t75,3t1,75t0t2t1t3                       
6 AB06t30/01/11t1t15t70,2t1,7t1t6t0t9                        
7 AB07t05/08/15t1t22t60t1,65t1t5t1t3                         

Obviamente problemático, mas como resolvemos isso? Com a função read_delim! Reparem que o separador utilizado na base modificada é a letra t, a função read_delim recebe um argumento delim, ou seja, o delimitador entre as células.

Principais argumentos da função read_delim:

  - file - o arquivo a ser importado;

  - delim - o carcater usado para separar as variáveis;

  - col_names - um argumento lógico indicando se o arquivo possui ou não os nomes das variáveis (default = TRUE);

  - na - qual a codificação usada para dado faltante (default = c("", NA));

  - skip - número de linhas a serem puladas no momento da importação (default = 0);

  - locale - controla vários aspectos como decimal, enconding, entre outros.

#Importando o arquivo com a função read_delim
base_saude3 = read_delim(file = "Base saude modificada.txt", 
                  delim = "t", 
                  na = "9", 
                  locale = locale(decimal_mark = ","))

── Column specification ────────────────────────────────────────────────────────
cols(
  Codigo = col_character(),
  DaTaCole = col_character(),
  Sexo = col_double(),
  Idade = col_double(),
  Peso = col_double(),
  EsTaTura = col_double(),
  HIV = col_double(),
  Escol = col_double(),
  DST = col_double(),
  Tipo = col_double()
)
#Visualizando o objeto base_saude3
base_saude3
# A tibble: 7 x 10
  Codigo DaTaCole  Sexo Idade  Peso EsTaTura   HIV Escol   DST  Tipo
  <chr>  <chr>    <dbl> <dbl> <dbl>    <dbl> <dbl> <dbl> <dbl> <dbl>
1 AB01   14/10/15     1    20  61.2     1.6      1     3     1     2
2 AB02   09/02/16     0    30  60       1.55     0     5     0    NA
3 AB03   01/03/10     0    50  80       1.83     1     2     1     3
4 AB04   04/05/13     0    43  83       1.9      1    NA     1     2
5 AB05   20/05/14     0    22  75.3     1.75     0     2     1     3
6 AB06   30/01/11     1    15  70.2     1.7      1     6     0    NA
7 AB07   05/08/15     1    22  60       1.65     1     5     1     3

As funções read_csv e read_csv2 leem dados em arquivos .csv.

CSV (comma separeted values)

Principais argumentos da função read_csv2:

  - file - o arquivo a ser importado;

  - col_names - um argumento lógico indicando se o arquivo possui ou não os nomes das variáveis (default = TRUE);

  - na - qual a codificação usada para dado faltante (default =c("", NA));

  - skip - número de linhas a serem puladas no momento da importação (default = 0);

  - locale - controla vários aspectos como decimal, enconding, entre outros.

#Fazendo a leitura do arquivo Base saude.csv
base_saude4 = read_csv2(file = "Base saude.csv")
ℹ Using '\',\'' as decimal and '\'.\'' as grouping mark. Use `read_delim()` for more control.

── Column specification ────────────────────────────────────────────────────────
cols(
  Codigo = col_character(),
  Datacol = col_character(),
  Sexo = col_double(),
  Idade = col_double(),
  Peso = col_double(),
  Estatura = col_double(),
  HIV = col_double(),
  Escol = col_double(),
  DST = col_double(),
  Tipo = col_double()
)
base_saude4
# A tibble: 200 x 10
   Codigo Datacol   Sexo Idade  Peso Estatura   HIV Escol   DST  Tipo
   <chr>  <chr>    <dbl> <dbl> <dbl>    <dbl> <dbl> <dbl> <dbl> <dbl>
 1 AB01   14/10/15     1    20  61.2     1.6      1     3     1     2
 2 AB02   09/02/16     0    30  60       1.55     0     5     0     9
 3 AB03   01/03/10     0    50  80       1.83     1     2     1     3
 4 AB04   04/05/13     0    43  83       1.9      1     9     1     2
 5 AB05   20/05/14     0    22  75.3     1.75     0     2     1     3
 6 AB06   30/01/11     1    15  70.2     1.7      1     6     0     9
 7 AB07   05/08/15     1    22  60       1.65     1     5     1     3
 8 AB08   08/12/13     1    25  62       1.55     0     1     0     2
 9 AB09   03/11/10     1    32  61       1.62     1     4     1     1
10 AB10   10/10/10     1    33  55       1.55     1     5     1     9
# … with 190 more rows

As diferenças entre as duas funções para importação de arquivos .csv são o separador e o decimal. Quando forem importar um arquivo de extensão .csv, testem uma das funções e caso a exportação não esteja ocorrendo de forma correta, tente a outra função.

3.2 - Pacote readxl

alt text

A função read_excel importa dados em arquivos .xls e .xlsx.

Principais argumentos da função read_excel:

  - path - o arquivo a ser importado;

  - sheet - a planilha a ser importada;

  - col_names - um argumento lógico indicando se o arquivo possui ou não os nomes das variáveis (default = TRUE);

  - skip - número de linhas a serem puladas no momento da importação (default = 0);

  - na - qual a codificação usada para dado faltante (default = NA).

# Carregando o pacote readxl
library(readxl)

#Fazendo a leitura do arquivo Base saude.xlsx
base_saude5 = read_excel(path = "Base saude.xlsx", 
                         sheet = 1)
base_saude5
# A tibble: 200 x 10
   Codigo Datacol              Sexo Idade  Peso Estatura   HIV Escol   DST  Tipo
   <chr>  <dttm>              <dbl> <dbl> <dbl>    <dbl> <dbl> <dbl> <dbl> <dbl>
 1 AB01   2015-10-14 00:00:00     1    20  61.2     1.6      1     3     1     2
 2 AB02   2016-02-09 00:00:00     0    30  60       1.55     0     5     0     9
 3 AB03   2010-03-01 00:00:00     0    50  80       1.83     1     2     1     3
 4 AB04   2013-05-04 00:00:00     0    43  83       1.9      1     9     1     2
 5 AB05   2014-05-20 00:00:00     0    22  75.3     1.75     0     2     1     3
 6 AB06   2011-01-30 00:00:00     1    15  70.2     1.7      1     6     0     9
 7 AB07   2015-08-05 00:00:00     1    22  60       1.65     1     5     1     3
 8 AB08   2013-12-08 00:00:00     1    25  62       1.55     0     1     0     2
 9 AB09   2010-11-03 00:00:00     1    32  61       1.62     1     4     1     1
10 AB10   2010-10-10 00:00:00     1    33  55       1.55     1     5     1     9
# … with 190 more rows

O Pacote haven possui funções que permitem importar arquivos de diversos outros softwares estatísticos com extensões .dta, .sav, .sas7bdat, etc.

4 - Limpeza/organização/manipulação dos dados

Outro aspecto importante antes de realizarmos a visualização de dados é o processo de limpeza/organização/manipulação de seus dados. Esta tarefa pode ser a parte mais demorada de qualquer análise de dados. Consideraremos a seguir, algumas etapas importantes. Embora existam muitas abordagens, aquelas que usam os pacotes dplyr e tidyr estão entre as mais rápidas e fáceis de aprender.

A seguir serão apresentadas o uso das funções citadas acima utilizando o arquivo basePNUD.csv.

Atividade: Importe o arquivo PNUD.csv e guarde em um objeto chamado basePNUD.

4.1 - Função select

Esta função seleciona coluna (variáveis).

É possível fazer essa seleção utilizando nomes, índices, intervalos de variáveis ou utilizar as funções starts_with(x), ends_with, contains(x), matches(x), one_of(x) para selecionar subconjunto de variáveis de forma esperta.

#Carregando o pacote
library(dplyr)

#Selecionando todas as variáveis entre ano e região e a variável rdpc
basePNUD |> 
  select(ano:regiao,rdpc)
# A tibble: 16,694 x 5
     ano muni                  uf    regiao  rdpc
   <dbl> <chr>                 <chr> <chr>  <dbl>
 1  1991 ALTA FLORESTA D'OESTE RO    Norte  198. 
 2  1991 ARIQUEMES             RO    Norte  319. 
 3  1991 CABIXI                RO    Norte  116. 
 4  1991 CACOAL                RO    Norte  320. 
 5  1991 CEREJEIRAS            RO    Norte  240. 
 6  1991 COLORADO DO OESTE     RO    Norte  225. 
 7  1991 CORUMBIARA            RO    Norte   81.4
 8  1991 COSTA MARQUES         RO    Norte  250. 
 9  1991 ESPIGÃO D'OESTE       RO    Norte  263. 
10  1991 GUAJARÁ-MIRIM         RO    Norte  391. 
# … with 16,684 more rows
#Selecionando todas as variáveis com excessão de rdpc e regiao
basePNUD |> 
  select(-c(regiao, rdpc))
# A tibble: 16,694 x 12
     ano muni  uf     idhm idhm_e idhm_l idhm_r espvida  gini   pop    lat   lon
   <dbl> <chr> <chr> <dbl>  <dbl>  <dbl>  <dbl>   <dbl> <dbl> <dbl>  <dbl> <dbl>
 1  1991 ALTA… RO    0.329  0.112  0.617  0.516    62.0  0.63 22835 -11.9  -62.0
 2  1991 ARIQ… RO    0.432  0.199  0.684  0.593    66.0  0.57 55018  -9.91 -63.0
 3  1991 CABI… RO    0.309  0.108  0.636  0.43     63.2  0.7   5846 -13.5  -60.5
 4  1991 CACO… RO    0.407  0.171  0.667  0.593    65.0  0.66 66534 -11.4  -61.4
 5  1991 CERE… RO    0.386  0.167  0.629  0.547    62.7  0.6  19030 -13.2  -60.8
 6  1991 COLO… RO    0.376  0.151  0.658  0.536    64.5  0.62 25070 -13.1  -60.5
 7  1991 CORU… RO    0.203  0.039  0.572  0.373    59.3  0.59 10737 -13.0  -60.9
 8  1991 COST… RO    0.425  0.22   0.629  0.553    62.8  0.65  6902 -12.4  -64.2
 9  1991 ESPI… RO    0.388  0.159  0.653  0.561    64.2  0.63 22505 -11.5  -61.0
10  1991 GUAJ… RO    0.468  0.247  0.662  0.625    64.7  0.6  31240 -10.8  -65.3
# … with 16,684 more rows
#Selecionando a variável ano e todas as variáveis que comecem com idhm e salvando no objeto baseIDH
baseIDH = basePNUD |> 
  select(ano, starts_with('idhm'))

baseIDH
# A tibble: 16,694 x 5
     ano  idhm idhm_e idhm_l idhm_r
   <dbl> <dbl>  <dbl>  <dbl>  <dbl>
 1  1991 0.329  0.112  0.617  0.516
 2  1991 0.432  0.199  0.684  0.593
 3  1991 0.309  0.108  0.636  0.43 
 4  1991 0.407  0.171  0.667  0.593
 5  1991 0.386  0.167  0.629  0.547
 6  1991 0.376  0.151  0.658  0.536
 7  1991 0.203  0.039  0.572  0.373
 8  1991 0.425  0.22   0.629  0.553
 9  1991 0.388  0.159  0.653  0.561
10  1991 0.468  0.247  0.662  0.625
# … with 16,684 more rows
#É possível ordenar as variáveis na base com a função select
basePNUD |> 
  select(muni, ano, everything())
# A tibble: 16,694 x 14
   muni    ano uf    regiao  idhm idhm_e idhm_l idhm_r espvida  rdpc  gini   pop
   <chr> <dbl> <chr> <chr>  <dbl>  <dbl>  <dbl>  <dbl>   <dbl> <dbl> <dbl> <dbl>
 1 ALTA…  1991 RO    Norte  0.329  0.112  0.617  0.516    62.0 198.   0.63 22835
 2 ARIQ…  1991 RO    Norte  0.432  0.199  0.684  0.593    66.0 319.   0.57 55018
 3 CABI…  1991 RO    Norte  0.309  0.108  0.636  0.43     63.2 116.   0.7   5846
 4 CACO…  1991 RO    Norte  0.407  0.171  0.667  0.593    65.0 320.   0.66 66534
 5 CERE…  1991 RO    Norte  0.386  0.167  0.629  0.547    62.7 240.   0.6  19030
 6 COLO…  1991 RO    Norte  0.376  0.151  0.658  0.536    64.5 225.   0.62 25070
 7 CORU…  1991 RO    Norte  0.203  0.039  0.572  0.373    59.3  81.4  0.59 10737
 8 COST…  1991 RO    Norte  0.425  0.22   0.629  0.553    62.8 250.   0.65  6902
 9 ESPI…  1991 RO    Norte  0.388  0.159  0.653  0.561    64.2 263.   0.63 22505
10 GUAJ…  1991 RO    Norte  0.468  0.247  0.662  0.625    64.7 391.   0.6  31240
# … with 16,684 more rows, and 2 more variables: lat <dbl>, lon <dbl>

A função select também serve para ordenar as variáveis na base, uma vez que ela monta a nova base em função do ordenamento das variáveis selecionadas. Aqui a função everything usada em select permite com que não seja digitada o nome das demais variáveis. Deste modo, o comando acima, serviu para fazer com que as variáveis muni e ano fossem as primeiras variáveis da base e em seguida as demais viesem na ordem que já se encontravam.

4.2 - Função filter()

Essa função serve para filtrar linhas (selecionar linhas segundo algum critério).

#Selecionando somente as linhas do estado do CE
basePNUD |> 
  filter(uf == 'CE')
# A tibble: 552 x 14
     ano muni  uf    regiao  idhm idhm_e idhm_l idhm_r espvida  rdpc  gini   pop
   <dbl> <chr> <chr> <chr>  <dbl>  <dbl>  <dbl>  <dbl>   <dbl> <dbl> <dbl> <dbl>
 1  1991 ABAI… CE    Norde… 0.286  0.103  0.6    0.377    61    83.3  0.44  7826
 2  1991 ACAR… CE    Norde… 0.349  0.179  0.537  0.443    57.2 126.   0.45 11155
 3  1991 ACAR… CE    Norde… 0.277  0.089  0.534  0.449    57.0 131.   0.51 44505
 4  1991 ACOP… CE    Norde… 0.254  0.077  0.514  0.413    55.8 104.   0.58 48912
 5  1991 AIUA… CE    Norde… 0.256  0.081  0.574  0.36     59.4  75.0  0.62 13125
 6  1991 ALCÂ… CE    Norde… 0.285  0.122  0.49   0.386    54.4  88.5  0.47  8551
 7  1991 ALTA… CE    Norde… 0.288  0.122  0.512  0.381    55.7  85.9  0.62  4658
 8  1991 ALTO… CE    Norde… 0.304  0.097  0.661  0.438    64.7 122.   0.48 12748
 9  1991 AMON… CE    Norde… 0.241  0.062  0.619  0.366    62.2  77.9  0.5  24910
10  1991 ANTO… CE    Norde… 0.309  0.129  0.561  0.409    58.7 102.   0.55  4988
# … with 542 more rows, and 2 more variables: lat <dbl>, lon <dbl>

Vale resslatar que o símbolo == significa igual e = significa recebe no R.

#Selecionando as variáveis ano, região, uf e idhm e em seguida filtrando as linhas que são dos estados do CE ou RJ no ano de 2010.
basePNUD |> 
  select(ano,regiao,uf,idhm) |> 
  filter(uf %in% c('CE', 'RJ') , ano == 2010)
# A tibble: 275 x 4
     ano regiao   uf     idhm
   <dbl> <chr>    <chr> <dbl>
 1  2010 Nordeste CE    0.628
 2  2010 Nordeste CE    0.606
 3  2010 Nordeste CE    0.601
 4  2010 Nordeste CE    0.595
 5  2010 Nordeste CE    0.569
 6  2010 Nordeste CE    0.6  
 7  2010 Nordeste CE    0.602
 8  2010 Nordeste CE    0.601
 9  2010 Nordeste CE    0.606
10  2010 Nordeste CE    0.599
# … with 265 more rows

Percebemos que no resultado final foram apresentadas somente as variáveis selecionadas e as linhas que satisfaziam a condição especificada: ser um município do estado do RJ ou CE no ano de 2010.

4.3 - Função mutate

Função que permite criar/modificar variáveis na base de dados existente.

#Selecionando as variáveis muni, rdpc, pop, idhm_l e espvida e em seguida criando as variáveis renda, razao e renda2
basePNUD |> 
  select(muni,rdpc,pop,idhm_l,espvida) |> 
  mutate(renda = rdpc * pop, 
         razao = idhm_l / espvida,
         renda2 = renda/razao)
# A tibble: 16,694 x 8
   muni                   rdpc   pop idhm_l espvida     renda   razao     renda2
   <chr>                 <dbl> <dbl>  <dbl>   <dbl>     <dbl>   <dbl>      <dbl>
 1 ALTA FLORESTA D'OESTE 198.  22835  0.617    62.0  4531834. 0.00995     4.55e8
 2 ARIQUEMES             319.  55018  0.684    66.0 17576600. 0.0104      1.70e9
 3 CABIXI                116.   5846  0.636    63.2   680357. 0.0101      6.76e7
 4 CACOAL                320.  66534  0.667    65.0 21306848. 0.0103      2.08e9
 5 CEREJEIRAS            240.  19030  0.629    62.7  4569103  0.0100      4.56e8
 6 COLORADO DO OESTE     225.  25070  0.658    64.5  5636237. 0.0102      5.52e8
 7 CORUMBIARA             81.4 10737  0.572    59.3   873777. 0.00964     9.06e7
 8 COSTA MARQUES         250.   6902  0.629    62.8  1726052. 0.0100      1.72e8
 9 ESPIGÃO D'OESTE       263.  22505  0.653    64.2  5919490. 0.0102      5.82e8
10 GUAJARÁ-MIRIM         391.  31240  0.662    64.7 12226399. 0.0102      1.20e9
# … with 16,684 more rows

A função mutate permite criar novas variáveis na base de dados ao mesmo tempo, inclusive nos permite usar uma das variáveis que estão sendo criadas para criar uma outra nova variável.

4.4 - Função group_by e summarise

Esta função sumariza variáveis da base. Ela aplica uma função às variáveis. Geralmente ela é utilizada em conjunto com a função group_by.

#Calculando o número de municípios por região e a média da espectativa de vida para todas as regiões em todos os anos e ordenando o resultando em ordem decrescente pelo valor da espectativa de vida
basePNUD  |>  
  group_by(ano, regiao) |> 
  summarise(n = n(), 
            espvida = mean(espvida, na.rm = TRUE)) |> 
  arrange(regiao,desc(espvida))
`summarise()` has grouped output by 'ano'. You can override using the `.groups` argument.
# A tibble: 15 x 4
# Groups:   ano [3]
     ano regiao           n espvida
   <dbl> <chr>        <int>   <dbl>
 1  2010 Centro-Oeste   465    74.3
 2  2000 Centro-Oeste   465    70.0
 3  1991 Centro-Oeste   465    65.1
 4  2010 Nordeste      1794    70.3
 5  2000 Nordeste      1794    64.2
 6  1991 Nordeste      1794    58.5
 7  2010 Norte          449    71.8
 8  2000 Norte          449    66.4
 9  1991 Norte          457    61.6
10  2010 Sudeste       1667    74.7
11  2000 Sudeste       1667    70.8
12  1991 Sudeste       1667    66.6
13  2010 Sul           1187    75.1
14  2000 Sul           1187    71.6
15  1991 Sul           1187    67.9

A função n() seria equivalente a função length(). Pelo resultado final, percebemos que no ano de 2010 existiam 465 municípios na região Centro-oeste e a expectativa de vida média dos municípios era de 74,3 anos.

A função summarise será extremamente útil para calcularmos medidas resumos de interesse para subgrupos da base de dados.

4.5 - Função spread

Esta função pertence ao pacote tidyr. A função spread transforma um par de colunas chave:valor em um conjunto de colunas organizadas.

Principais argumentos da função spread:

  - data - o data frame que será reorganizado;

  - key - o nome da coluna chave (que será transformada em várias colunas);

  - value - o nome da coluna que alimentará as colunas que serão criadas a partir da chave.

Atividade: Importe a planilha pop_casos do arquivo Base_pais.xlsx e guarde em um objeto chamado base_pais_1.

# A tibble: 12 x 4
   pais        ano variaveis     valor
   <chr>     <dbl> <chr>         <dbl>
 1 Brasil     2019 casos         34567
 2 Brasil     2019 populacao 211000000
 3 Brasil     2020 casos         45281
 4 Brasil     2020 populacao 211800000
 5 Argentina  2019 casos          1231
 6 Argentina  2019 populacao  44940000
 7 Argentina  2020 casos          1456
 8 Argentina  2020 populacao  45808747
 9 Uruguai    2019 casos           890
10 Uruguai    2019 populacao   3462000
11 Uruguai    2020 casos          1001
12 Uruguai    2020 populacao   3800000
# Carregando o pacote readxl
library(tidyr)

#Fazendo a leitura do arquivo Base saude.xlsx
base_pais_1_reorg = base_pais_1 |> 
  spread(key = variaveis,
         value = valor)

base_pais_1_reorg
# A tibble: 6 x 4
  pais        ano casos populacao
  <chr>     <dbl> <dbl>     <dbl>
1 Argentina  2019  1231  44940000
2 Argentina  2020  1456  45808747
3 Brasil     2019 34567 211000000
4 Brasil     2020 45281 211800000
5 Uruguai    2019   890   3462000
6 Uruguai    2020  1001   3800000

A figura abaixo ilustra a operação que foi realizada.

4.6 - Função gather

A função também pertence ao pacote tidyr. A função gather faz o reverso da função spread, isto é, ela armazena um conjunto de colunas em uma coluna chave.

Principais argumentos da função gather:

  - data - o data frame que será reorganizado;

  - key - o nome que será dado a coluna chave (que armazenará os nomes das colunas das variáveis que serão agrupadas);

  - value - o nome da que será dado a coluna na qual ficarão os valores das colunas das variáveis que serão agrupadas.

Atividade: Importe a planilha casos do arquivo Base_pais.xlsx e guarde em um objeto chamado base_pais_2.

# A tibble: 3 x 3
  pais      `2019` `2020`
  <chr>      <dbl>  <dbl>
1 Brasil     34567  45281
2 Argentina   1231   1456
3 Uruguai      890   1001
#Fazendo a leitura do arquivo Base saude.xlsx
base_pais_2_reorg = base_pais_2 |> 
  gather(key = "ano",
         value = "casos",
         2:3)

base_pais_2_reorg
# A tibble: 6 x 3
  pais      ano   casos
  <chr>     <chr> <dbl>
1 Brasil    2019  34567
2 Argentina 2019   1231
3 Uruguai   2019    890
4 Brasil    2020  45281
5 Argentina 2020   1456
6 Uruguai   2020   1001