Criando tabelas de frequência no R

Tutoriais de R
Autora

Esthela Sá

Data de Publicação

18 de abril de 2023

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.

library(tidyverse)
library(kableExtra)

data("starwars")

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) 
Sexo e gênero dos personagens de Star Wars
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

Notas de rodapé

  1. 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.↩︎