4 Básico do Tidyverse

Quando instalamos o R e o RStudio, apenas as funções básicas do R são instaladas. Outros pacotes são necessários para funções específicas.

Um pacote que permite a organização e manipulação de dados é o Tidyverse. Este pacote contém outros, tais como: ggplot2, dplyr, tidyr, readr, purrr, tibble, stringr, forcats.

O primeiro passo será instalar o pacote tidyverse, usando a função install.packages(). Alternativamente, é possível fazer a instalação usando a ferramenta Tools/Install Packages do menu do RStudio.

#para instalar o pacote
install.packages(tidyverse)

Depois de instalado, o pacote precisa ser carregado a partir da função library().

#para carregar o pacote instalado
library(tidyverse)

Observe que ao carregar o pacote tidyverse, os pacotes ggplot2, dplyr, tidyr, readr, purrr, tibble, stringr, forcats são carregados também.

4.1 O operador Pipe no tidyverse

O operador %>% é usado para expressar uma sequência de operações múltiplas, por exemplo, a saída de uma função ou expressão é passada a uma outra função como um argumento. No código, pode ser traduzido como então.

Pontos importantes no uso do Pipe no R

  • quando usar o pacote tidyverse o operador %>% fica automaticamente disponível para uso.

  • ele considera a saída de uma função e a usa em outra função como um argumento;

  • funciona com uma função que leva uma entrada;

  • se uma função precisar de duas entradas, então não poderá ser usado.

Quando você tem um código complexo para escrever na programação R, às vezes você aninha as operações que resultam em um código R ilegível e é difícil para outras pessoas entenderem. Usando o operador %>% é possível encadear uma sequência para evitar a gravação de código complexo.

Além disso, usando o operador Pipe %>% ajuda a economizar memória. Por causa disso, tem sido usado em muitos pacotes do R. Por exemplo, imagine que você tenha chamado 3 funções e o resultado de cada função é passado como entrada para a função subsequente. Quando você não usa o Pipe, você tem que armazenar o resultado de cada função em uma variável e usar esta variável em outra função. Desta forma você armazena 3 variáveis na memória com os dados. Ao usar o operador Pipe, você pode evitar variáveis intermediárias e encadear as funções.

4.2 Selecionando colunas

Vimos que ‘codigos’ contém diversas colunas que não serão utilizadas. Interessam-nos apenas as colunas ‘cod_ibge’, ‘municipios’ e ‘reg_administrativa’. Para criar um novo dataframe com apenas estas duas colunas, vamos usar a função select. Atribuiremos à seleção, o nome de ‘nomes_munic’.

#para selecionar apenas as colunas 'cod_ibge', 'municipios' e 'reg_administrativa'
nomes_munic <- codigos %>% 
  select(cod_ibge, municipios, reg_administrativa)
#para visualizar
head(nomes_munic)
##   cod_ibge               municipios          reg_administrativa
## 1  3500000 Estado sem especificação    Estado sem especificação
## 2  3500105               Adamantina   RA de Presidente Prudente
## 3  3500204                   Adolfo RA de São José do Rio Preto
## 4  3500303                    Aguaí              RA de Campinas
## 5  3500402           Águas da Prata              RA de Campinas
## 6  3500501         Águas de Lindóia              RA de Campinas

4.3 Combinando dataframes

O Tidyverse oferece diversas possibilidades de unir dois dataframes. Este resumo em pdf apresenta as principais funções do Tidyverse (https://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf). Os conjuntos de dados podem ser combinados a partir das seguintes funções: left_join, right_join, inner_join, full_join, semi_join e anti_join.

Como podemos observar, os dois dataframes (‘evol_casam’ e ‘nomes_munic’) têm uma coluna com o mesmo nome (‘cod_ibge’), cujos códigos apresentam 7 dígitos. Desta forma, esta coluna será usada para unirmos os dois dataframes para termos os nomes dos municípios, que não aparecem em ‘evol_casam’.

Com os dois dataframes, podemos uni-los usando a função right_join. Imagine duas tabelas que serão unidas. A tabela de ‘nomes_munic’ contém 646 linhas. A tabela de ‘evol_casam’ contém 14123 linhas porque são 21 anos de dados. Queremos que a tabela ‘evol_casam’ receba os nomes dos municípios da tabela ‘nomes_munic’. Usando a função right_join os nomes dos municípios da tabela à esquerda (nomes_munic) farão correspondência com todas as linhas da tabela à direita (evol_casam).

#para unir os dois dataframes
casam <- right_join(nomes_munic, evol_casam, by="cod_ibge")
#para visualizar as 6 primeiras linhas
head(casam)
##   cod_ibge municipios        reg_administrativa  ano entre.pessoas.de.sexos.diferentes
## 1  3500105 Adamantina RA de Presidente Prudente 2000                               139
## 2  3500105 Adamantina RA de Presidente Prudente 2001                               136
## 3  3500105 Adamantina RA de Presidente Prudente 2002                               112
## 4  3500105 Adamantina RA de Presidente Prudente 2003                               141
## 5  3500105 Adamantina RA de Presidente Prudente 2004                               119
## 6  3500105 Adamantina RA de Presidente Prudente 2005                               125
##   entre.pessoas.do.mesmo.sexo ignorado total
## 1                          NA       NA   139
## 2                          NA       NA   136
## 3                          NA       NA   112
## 4                          NA       NA   141
## 5                          NA       NA   119
## 6                          NA       NA   125
#para visualizar as 6 últimas linhas
tail(casam)
##       cod_ibge   municipios reg_administrativa  ano entre.pessoas.de.sexos.diferentes
## 14763  3557303 Estiva Gerbi     RA de Campinas 2017                                86
## 14764  3557303 Estiva Gerbi     RA de Campinas 2018                                65
## 14765  3557303 Estiva Gerbi     RA de Campinas 2019                                86
## 14766  3557303 Estiva Gerbi     RA de Campinas 2020                                56
## 14767  3557303 Estiva Gerbi     RA de Campinas 2021                                74
## 14768  3557303 Estiva Gerbi     RA de Campinas 2022                                69
##       entre.pessoas.do.mesmo.sexo ignorado total
## 14763                          NA       NA    86
## 14764                           1       NA    66
## 14765                          NA       NA    86
## 14766                           1       NA    57
## 14767                           1       NA    75
## 14768                          NA       NA    69

Outra forma de entender melhor os dados é olhando a sua estrutura. Use str()

#para ver a estrutura dos dados
str(casam)
## 'data.frame':    14768 obs. of  8 variables:
##  $ cod_ibge                         : int  3500105 3500105 3500105 3500105 3500105 3500105 3500105 3500105 3500105 3500105 ...
##  $ municipios                       : chr  "Adamantina" "Adamantina" "Adamantina" "Adamantina" ...
##  $ reg_administrativa               : chr  "RA de Presidente Prudente" "RA de Presidente Prudente" "RA de Presidente Prudente" "RA de Presidente Prudente" ...
##  $ ano                              : int  2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 ...
##  $ entre.pessoas.de.sexos.diferentes: int  139 136 112 141 119 125 196 185 173 148 ...
##  $ entre.pessoas.do.mesmo.sexo      : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ ignorado                         : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ total                            : int  139 136 112 141 119 125 196 185 173 148 ...

4.4 Filtrando observações

A função filter() filtra as observações (linhas) de acordo com uma condição.

A partir do dataframe ‘casam’, vamos filtrar os dados para mantermos apenas dados do ano de 2021, criando o objeto ‘casam_2021’.

#para filtrar para o ano 2021
casam_2021 <- casam %>%
  filter(ano == 2021)

Outras condições podem ser também filtradas. Vamos filtrar para o município “São Paulo”.

casam %>%
  filter(municipios == "São Paulo")
##    cod_ibge municipios reg_administrativa  ano entre.pessoas.de.sexos.diferentes
## 1   3550308  São Paulo   RM  de São Paulo 2000                             47937
## 2   3550308  São Paulo   RM  de São Paulo 2001                             50019
## 3   3550308  São Paulo   RM  de São Paulo 2002                             50035
## 4   3550308  São Paulo   RM  de São Paulo 2003                             51117
## 5   3550308  São Paulo   RM  de São Paulo 2004                             55887
## 6   3550308  São Paulo   RM  de São Paulo 2005                             57688
## 7   3550308  São Paulo   RM  de São Paulo 2006                             60248
## 8   3550308  São Paulo   RM  de São Paulo 2007                             62883
## 9   3550308  São Paulo   RM  de São Paulo 2008                             65732
## 10  3550308  São Paulo   RM  de São Paulo 2009                             62700
## 11  3550308  São Paulo   RM  de São Paulo 2010                             62990
## 12  3550308  São Paulo   RM  de São Paulo 2011                             65764
## 13  3550308  São Paulo   RM  de São Paulo 2012                             66305
## 14  3550308  São Paulo   RM  de São Paulo 2013                             67226
## 15  3550308  São Paulo   RM  de São Paulo 2014                             70960
## 16  3550308  São Paulo   RM  de São Paulo 2015                             73716
## 17  3550308  São Paulo   RM  de São Paulo 2016                             70500
## 18  3550308  São Paulo   RM  de São Paulo 2017                             70385
## 19  3550308  São Paulo   RM  de São Paulo 2018                             65732
## 20  3550308  São Paulo   RM  de São Paulo 2019                             63658
## 21  3550308  São Paulo   RM  de São Paulo 2020                             45375
## 22  3550308  São Paulo   RM  de São Paulo 2021                             52072
## 23  3550308  São Paulo   RM  de São Paulo 2022                             56213
##    entre.pessoas.do.mesmo.sexo ignorado total
## 1                           NA       NA 47937
## 2                           NA       NA 50019
## 3                           NA       NA 50035
## 4                           NA       NA 51117
## 5                           NA       NA 55887
## 6                           NA       NA 57688
## 7                           NA       NA 60248
## 8                           NA       NA 62883
## 9                           NA       NA 65732
## 10                          NA       NA 62700
## 11                          NA       NA 62990
## 12                          NA       NA 65764
## 13                          NA       NA 66305
## 14                         820      248 68294
## 15                         791       NA 71751
## 16                         770       NA 74486
## 17                         798       NA 71298
## 18                         926       NA 71311
## 19                        1767       NA 67499
## 20                        1385       NA 65043
## 21                         969       NA 46344
## 22                        1109       NA 53181
## 23                        1638        1 57852

As duas condições podem ser filtradas em um mesmo código.

casam %>%
  filter(ano == 2021, municipios == "São Paulo")
##   cod_ibge municipios reg_administrativa  ano entre.pessoas.de.sexos.diferentes
## 1  3550308  São Paulo   RM  de São Paulo 2021                             52072
##   entre.pessoas.do.mesmo.sexo ignorado total
## 1                        1109       NA 53181

Também é possível filtrar a partir de operadores lógicos. Vamos filtrar os municípios com casamentos entre pessoas de sexos diferentes maior do que 5000 em 2021.

#para filtrar para o ano de 2021 e municípios com casamentos entre pessoas de sexos diferentes maiores do que 5 mil
casam %>% 
  filter(ano == 2021, entre.pessoas.de.sexos.diferentes > 5000)
##   cod_ibge municipios reg_administrativa  ano entre.pessoas.de.sexos.diferentes
## 1  3509502   Campinas     RA de Campinas 2021                              6017
## 2  3518800  Guarulhos   RM  de São Paulo 2021                              7021
## 3  3550308  São Paulo   RM  de São Paulo 2021                             52072
##   entre.pessoas.do.mesmo.sexo ignorado total
## 1                         107       NA  6124
## 2                          79       NA  7100
## 3                        1109       NA 53181

4.5 Organizando uma tabela com a função arrange()

A função arrange() organiza uma tabela com base em uma variável (coluna). A condição default é a ordem crescente. Para indicar ordem decrescente, é necessário indicar desc. Vamos a um exemplo. Vamos solicitar a organização da tabela pela coluna entre.pessoas.de.mesmo.sexo.

#para filtrar as linhas que correspondem ao ano 2021
msexo_2021 <- casam %>%
  filter(ano == 2021) %>%
#para organizar em ordem crescente
  arrange(entre.pessoas.do.mesmo.sexo)
#para visualizar
head(msexo_2021)
##   cod_ibge             municipios          reg_administrativa  ano
## 1  3500105             Adamantina   RA de Presidente Prudente 2021
## 2  3500204                 Adolfo RA de São José do Rio Preto 2021
## 3  3500550 Águas de Santa Bárbara              RA de Sorocaba 2021
## 4  3500600     Águas de São Pedro              RA de Campinas 2021
## 5  3500808      Alfredo Marcondes   RA de Presidente Prudente 2021
## 6  3501707    Américo Brasiliense                  RA Central 2021
##   entre.pessoas.de.sexos.diferentes entre.pessoas.do.mesmo.sexo ignorado total
## 1                               122                           1       NA   123
## 2                                27                           1       NA    28
## 3                                34                           1       NA    35
## 4                                16                           1       NA    17
## 5                                21                           1       NA    22
## 6                               168                           1       NA   169

Para organizar em ordem decrescente:

#para filtrar as linhas que correspondem ao ano 2021
casam_msexo_desc <- casam %>%
  filter(ano == 2021) %>%
#para organizar em ordem decrescente
  arrange(desc(entre.pessoas.do.mesmo.sexo))
#para visualizar
head(casam_msexo_desc)
##   cod_ibge     municipios   reg_administrativa  ano entre.pessoas.de.sexos.diferentes
## 1  3550308      São Paulo     RM  de São Paulo 2021                             52072
## 2  3509502       Campinas       RA de Campinas 2021                              6017
## 3  3518800      Guarulhos     RM  de São Paulo 2021                              7021
## 4  3543402 Ribeirão Preto RA de Ribeirão Preto 2021                              3636
## 5  3552205       Sorocaba       RA de Sorocaba 2021                              4283
## 6  3534401         Osasco     RM  de São Paulo 2021                              4224
##   entre.pessoas.do.mesmo.sexo ignorado total
## 1                        1109       NA 53181
## 2                         107       NA  6124
## 3                          79       NA  7100
## 4                          79       NA  3715
## 5                          76       NA  4359
## 6                          71       NA  4295

4.6 O verbo “mutate”

Digamos que quiséssemos ter uma coluna com a porcentagem de casamentos entre pessoas de sexos diferentes. Para isso seria necessário dividir a coluna entre.pessoas.de.sexos.diferentes pela coluna total e multiplicar por 100. A função mutate() permite mudar por meio de cálculos ou adicionar variáveis (colunas).

#para acrescentar uma coluna com os resultados da porcentagem de casamentos entre pessoas de sexos diferentes
casam1 <- casam %>%
  mutate(perc_sexodif = entre.pessoas.de.sexos.diferentes / total * 100) %>% 
#para organizar a coluna em ordem decrescente
  arrange(desc(perc_sexodif))
#para visualizar as 6 primeiras linhas
head(casam1)
##   cod_ibge municipios        reg_administrativa  ano entre.pessoas.de.sexos.diferentes
## 1  3500105 Adamantina RA de Presidente Prudente 2000                               139
## 2  3500105 Adamantina RA de Presidente Prudente 2001                               136
## 3  3500105 Adamantina RA de Presidente Prudente 2002                               112
## 4  3500105 Adamantina RA de Presidente Prudente 2003                               141
## 5  3500105 Adamantina RA de Presidente Prudente 2004                               119
## 6  3500105 Adamantina RA de Presidente Prudente 2005                               125
##   entre.pessoas.do.mesmo.sexo ignorado total perc_sexodif
## 1                          NA       NA   139          100
## 2                          NA       NA   136          100
## 3                          NA       NA   112          100
## 4                          NA       NA   141          100
## 5                          NA       NA   119          100
## 6                          NA       NA   125          100

Observe que municípios com pequeno número total de casamentos, quando 1 deles é entre pessoas do mesmo sexo, o percentual fica elevado.

4.7 Agrupando dados com a função group_by

A função group_by permite aplicar cálculos de resumo segundo grupos, por exemplo, por ano, por Região Administrativa, etc. Para usar essa função é necessário definir o tipo de agregação que queremos. Em outras palavras, se vamos agrupar os casamentos por Região Administrativa, os resultados serão as somas dos casamentos das regiões? Ou seriam as médias? Dependendo da variável, não faz sentido efetuarmos a soma como no caso de variáveis resultantes de divisões (índices, porcentagens, razões, etc.) deve-se calcular a média, por meio da função summarize (mean). No nosso exemplo, vamos agrupar as regiões administrativas por meio de soma para as variáveis entre.pessoas.de.sexos.diferentes, entre.pessoas.do.mesmo.sexo e total.

#para agrupar por região administrativa
casam %>% 
  group_by(reg_administrativa) %>%
#para definir a soma como operação de agrupamento. 'na.omit' é usado para que a soma desconsidere os valores NA da coluna entre.pessoas.do.mesmo.sexo
  summarize(tot_sexodif = sum(entre.pessoas.de.sexos.diferentes),
            tot_msexo = sum(na.omit(entre.pessoas.do.mesmo.sexo)),
            tot_todos = sum(total))
## # A tibble: 16 × 4
##    reg_administrativa          tot_sexodif tot_msexo tot_todos
##    <chr>                             <int>     <int>     <int>
##  1 RA Central                       132776       619    133420
##  2 RA de Araçatuba                  100275       307    100602
##  3 RA de Barretos                    57897       211     58119
##  4 RA de Bauru                      148751       552    149316
##  5 RA de Campinas                   893340      3840    897859
##  6 RA de Franca                      92649       301     92974
##  7 RA de Itapeva                     72322       131     72475
##  8 RA de Marília                    129304       373    129700
##  9 RA de Presidente Prudente        116224       327    116563
## 10 RA de Registro                    36611        67     36692
## 11 RA de Ribeirão Preto             162735       813    163579
## 12 RA de Santos                     211221      1482    212739
## 13 RA de Sorocaba                   346753      1590    348424
## 14 RA de São José do Rio Preto      194609       871    195513
## 15 RA de São José dos Campos        334861      1499    336420
## 16 RM  de São Paulo                2616946     16027   2633463

Observe que passamos a ter 16 linhas, correspondendo às 16 Regiões Administrativas do Estado. Vamos resumir por ano e região administrativa.

#para agrupar por região administrativa
casam_regadm <- casam %>% 
  group_by(ano, reg_administrativa) %>%
#para definir a soma como operação de agrupamento. 'na.omit' é usado para que a soma desconsidere os valores NA da coluna entre.pessoas.do.mesmo.sexo
  summarize(tot_sexodif = sum(entre.pessoas.de.sexos.diferentes),
            tot_msexo = sum(na.omit(entre.pessoas.do.mesmo.sexo)),
            tot_todos = sum(total))
## `summarise()` has grouped output by 'ano'. You can override using the `.groups` argument.
#para visualizar
head(casam_regadm)
## # A tibble: 6 × 5
## # Groups:   ano [1]
##     ano reg_administrativa tot_sexodif tot_msexo tot_todos
##   <int> <chr>                    <int>     <int>     <int>
## 1  2000 RA Central                4164         0      4164
## 2  2000 RA de Araçatuba           3438         0      3438
## 3  2000 RA de Barretos            1662         0      1662
## 4  2000 RA de Bauru               5116         0      5116
## 5  2000 RA de Campinas           28634         0     28634
## 6  2000 RA de Franca              3291         0      3291

Agora temos 352 linhas, resultantes de 16 regiões administrativas vezes 22 anos.

4.8 Rumo aos mapas

Agora que você teve uma introdução rápida ao R e aprendeu a fazer cálculos entre colunas, unir dataframes e agrupar dados, tem a bagagem mínima para entrar em contato com a teoria da Cartografia Temática e a elaborar seus mapas em R. Novas funções serão apresentadas à medida que forem necessárias.