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 sex
e 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.↩︎