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.
Depois de instalado, o pacote precisa ser carregado a partir da função library().
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
## 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()
## '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’.
Outras condições podem ser também filtradas. Vamos filtrar para o município “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.
## 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.
## # 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.