library(tidyverse)
library(kableExtra)
data("starwars")
Introdução
Nesse post, vamos aprender a fazer tabelas de frequência usando os pacotes do tidyverse e o pacote kableExtra1.
Para explificar, nós vamos utilizar o banco de dados starwars que vem com o pacote dplyr. O dplyr faz parte do tidyverse, então, assim que você ativar esse conjunto de pacotes, o banco vai estar disponível.
Caso ainda não tenha instalado o tidyverse, basta usar o comando abaixo:
install.packages("tidyverse")Ao dar uma olhada no banco com a função glimpse()vimos que há diversas variáveis categóricas (hair_color, skin_color, sex, gender, homeworld, species). Para esse exemplo, vamos usar as variáveis sexe gender. Se quiser entender melhor o que são variáveis categóricas, você pode acessar meu outro post sobre tipos de variáveis clicando aqui.
glimpse(starwars)Rows: 87
Columns: 14
$ name <chr> "Luke Skywalker", "C-3PO", "R2-D2", "Darth Vader", "Leia Or…
$ height <int> 172, 167, 96, 202, 150, 178, 165, 97, 183, 182, 188, 180, 2…
$ mass <dbl> 77.0, 75.0, 32.0, 136.0, 49.0, 120.0, 75.0, 32.0, 84.0, 77.…
$ hair_color <chr> "blond", NA, NA, "none", "brown", "brown, grey", "brown", N…
$ skin_color <chr> "fair", "gold", "white, blue", "white", "light", "light", "…
$ eye_color <chr> "blue", "yellow", "red", "yellow", "brown", "blue", "blue",…
$ birth_year <dbl> 19.0, 112.0, 33.0, 41.9, 19.0, 52.0, 47.0, NA, 24.0, 57.0, …
$ sex <chr> "male", "none", "none", "male", "female", "male", "female",…
$ gender <chr> "masculine", "masculine", "masculine", "masculine", "femini…
$ homeworld <chr> "Tatooine", "Tatooine", "Naboo", "Tatooine", "Alderaan", "T…
$ species <chr> "Human", "Droid", "Droid", "Human", "Human", "Human", "Huma…
$ films <list> <"The Empire Strikes Back", "Revenge of the Sith", "Return…
$ vehicles <list> <"Snowspeeder", "Imperial Speeder Bike">, <>, <>, <>, "Imp…
$ starships <list> <"X-wing", "Imperial shuttle">, <>, <>, "TIE Advanced x1",…
Passo 1: Quais níveis há em cada variável (distinct())?
A função distinct() mostra as linhas únicas de um banco de dados. Desta forma, ao aplicá-la em variávies individualmente, podemos saber quais as suas respectivas categorias. Na variável sex há 4 categorias (male,none, female e hermaphroditic) e valores ausentes (NA). Por sua vez, em gender há duas categorias (masculine e feminine) e também valores ausentes (NA).
starwars |>
distinct(sex)# A tibble: 5 × 1
sex
<chr>
1 male
2 none
3 female
4 hermaphroditic
5 <NA>
starwars |>
distinct(gender)# A tibble: 3 × 1
gender
<chr>
1 masculine
2 feminine
3 <NA>
Passo 2: Selecionar as variáveis de interese (select()) e remover os valores ausentes (drop_na())
A função select() seleciona colunas (variáveis) e drop_na() remove valores ausentes (NA na linguagem do R ou missing, para quem está acostumando com o SPSS).
starwars |>
select(sex,
gender) |>
drop_na() # A tibble: 83 × 2
sex gender
<chr> <chr>
1 male masculine
2 none masculine
3 none masculine
4 male masculine
5 female feminine
6 male masculine
7 female feminine
8 none masculine
9 male masculine
10 male masculine
# ℹ 73 more rows
Passo 3: Transformar a versão larga do banco de dados em longa (pivot_longer())
Ao usar a função pivot_longer() sex e gender viraram categorias da variável name e as categorias dessas variáveis foram para a variável value.
starwars |>
select(sex,
gender) |>
drop_na() |>
pivot_longer(cols = c(sex,
gender))# A tibble: 166 × 2
name value
<chr> <chr>
1 sex male
2 gender masculine
3 sex none
4 gender masculine
5 sex none
6 gender masculine
7 sex male
8 gender masculine
9 sex female
10 gender feminine
# ℹ 156 more rows
Passo 4: Contar as categorias das variáveis do banco longo (count())
Com a função count()podemos contar valores únicos de uma ou mais variáveis. Ao colocar as duas variáveis do nosso banco longo (name e value) dentro da função, agrupamos os dados pelas duas colunas e, em seguida, contamos.
starwars |>
select(sex,
gender) |>
drop_na() |>
pivot_longer(cols = c(sex,
gender)) |>
count(name,
value)# A tibble: 6 × 3
name value n
<chr> <chr> <int>
1 gender feminine 17
2 gender masculine 66
3 sex female 16
4 sex hermaphroditic 1
5 sex male 60
6 sex none 6
Passo 5: calcular os percentuais (mutate())
A função mutate() permite criar novas variáveis (colunas) no banco. No nosso caso, queremos criar uma coluna com os percentuais (%) de cada categoria. Para isso, precisamos agrupar o banco (group_by()) pela variável que contém as variáveis originais (name) e, em seguida, fazer a cáulculo dos percentuais. Se não agruparmos, o R vai calcular os percentuais de cada linha em relação ao todo e não é isso que queremos. Lembre de colocar o % entre aspas “%” para que o R não se confunda e trate ele como caractere.
starwars |>
select(sex,
gender) |>
drop_na() |>
pivot_longer(cols = c(sex,
gender)) |>
count(name,
value) |>
group_by(name) |>
mutate("%" = ((n/sum(n))*100) |>
round(1))# A tibble: 6 × 4
# Groups: name [2]
name value n `%`
<chr> <chr> <int> <dbl>
1 gender feminine 17 20.5
2 gender masculine 66 79.5
3 sex female 16 19.3
4 sex hermaphroditic 1 1.2
5 sex male 60 72.3
6 sex none 6 7.2
Passo 6: Ordenar os valores pelas variáveis name e n (arrange)
Para organizar nossa tabela, queremos que os valores estejam do menor para o maior. Isso é possível com a função arrange(). Contudo, se fizermos isso usando só a coluna n como referência, os valores de cada categoria vão ficar misturados.
starwars |>
select(sex,
gender) |>
drop_na() |>
pivot_longer(c(sex,
gender)) |>
count(name,
value) |>
group_by(name) |>
mutate("%" = ((n/sum(n))*100) |>
round(1)) |>
ungroup() |>
arrange(n) # A tibble: 6 × 4
name value n `%`
<chr> <chr> <int> <dbl>
1 sex hermaphroditic 1 1.2
2 sex none 6 7.2
3 sex female 16 19.3
4 gender feminine 17 20.5
5 sex male 60 72.3
6 gender masculine 66 79.5
Passo 6.1: Ordenar os valores pelas variáveis name e n (arrange)
Para evitar essa confusão, vamos fazer a função arrange(), inicialmente, ordenar a tabela pelos níveis das variável name e, em seguida, pela coluna n.
starwars |>
select(sex,
gender) |>
drop_na() |>
pivot_longer(c(sex,
gender)) |>
count(name,
value) |>
group_by(name) |>
mutate("%" = ((n/sum(n))*100) |>
round(1)) |>
ungroup() |>
arrange(factor(name,
levels = c("sex",
"gender")),n)# A tibble: 6 × 4
name value n `%`
<chr> <chr> <int> <dbl>
1 sex hermaphroditic 1 1.2
2 sex none 6 7.2
3 sex female 16 19.3
4 sex male 60 72.3
5 gender feminine 17 20.5
6 gender masculine 66 79.5
Passo 7: Selecionar as colunas para a tabela (value, n e %) e renomear a coluna value para Variável (rename())
Agora vamos selecionar as colunas que precisamos em nossa tabela (value, n e %) e renomear value para Variável com a função rename().
starwars |>
select(sex,
gender) |>
drop_na() |>
pivot_longer(c(sex,
gender)) |>
count(name,
value) |>
group_by(name) |>
mutate("%" = ((n/sum(n))*100) |>
round(1)) |>
ungroup() |>
arrange(factor(name,
levels = c("sex",
"gender")),
desc(n)) |>
select(value,
n,
"%") |>
rename("Variável" = value)# A tibble: 6 × 3
Variável n `%`
<chr> <int> <dbl>
1 male 60 72.3
2 female 16 19.3
3 none 6 7.2
4 hermaphroditic 1 1.2
5 masculine 66 79.5
6 feminine 17 20.5
Passo 8: Salvar a tabela para um objeto
Para o código não ficar tão longo, vamos salvar a tabela em um objeto com o operador de atribuição <-.
sex_gender <-
starwars |>
select(sex,
gender) |>
drop_na() |>
pivot_longer(c(sex,
gender)) |>
count(name,
value) |>
group_by(name) |>
mutate("%" = ((n/sum(n))*100) |>
round(1)) |>
ungroup() |>
arrange(factor(name,
levels = c("sex",
"gender")),
desc(n)) |>
select(value,
n,
"%") |>
rename("Variável" = value)
sex_gender# A tibble: 6 × 3
Variável n `%`
<chr> <int> <dbl>
1 male 60 72.3
2 female 16 19.3
3 none 6 7.2
4 hermaphroditic 1 1.2
5 masculine 66 79.5
6 feminine 17 20.5
Passo 9: Formatar a tabela com o pacote kableExtra
E o pacote kableExtra faz a mágica final, mas a explicação sobre ele fica para outro post.
sex_gender |>
kbl(align = ("lcc"),
caption = "Sexo e gênero dos personagens de Star Wars") |>
kable_classic() |>
pack_rows("Sex",1,4) |>
pack_rows("Gender",5,6) | Variável | n | % |
|---|---|---|
| Sex | ||
| male | 60 | 72.3 |
| female | 16 | 19.3 |
| none | 6 | 7.2 |
| hermaphroditic | 1 | 1.2 |
| Gender | ||
| masculine | 66 | 79.5 |
| feminine | 17 | 20.5 |
Conclusões
Neste post você aprendeu a criar tabelas de frequência utilizando diversas funções do tidyverse.
Se estiver precisando de ajuda para analisar dados quantitativos ou outras atividades acadêmicas, você pode contatar a Beta Consultoria e Assessoria através do e-mail beta.consultac@gmail.com
Notas de rodapé
O conteúdo deste post é baseado em um material que está sendo produzido pelo professor Francisco Pablo Huascar Aragão Pinheiro para um curso de introdução ao R para análise de dados em Psicologia.↩︎