Em muitas análises de dados é comum lidarmos com variáveis categóricas que possuem grande variedade de respostas. No entanto, nem sempre precisamos visualizar todas elas. Em determinados casos, pode ser mais útil destacar apenas as categorias mais frequentes, facilitando a interpretação e o foco nos principais resultados.

No exemplo a seguir, vamos utilizar o R em conjunto com o pacote forcats, que oferece funções específicas para manipulação de variáveis fator. O objetivo é elaborar uma planilha que apresente apenas as 6 respostas mais frequentes em uma variável categórica, reorganizando os dados de forma prática e clara para posterior análise.

## Elaborar tabela com as 10 mais frequentes respostas
# Preparando a pasta de trabalho ------------------------------------------

# Identifica o diretorio de trabalho
getwd()
## [1] "C:/Users/bergd/OneDrive/Documentos/Script_R"
# Define o diretorio de trabalho do projeto
setwd("~/Script_R")

# Pacotes necessários -----------------------------------------------------
library(rio)
library(janitor)   # Limpeza dos nomes das variáveis
## 
## Anexando pacote: 'janitor'
## Os seguintes objetos são mascarados por 'package:stats':
## 
##     chisq.test, fisher.test
library(gtsummary) # Para criar tabelas
library(dplyr)     # Para manipulação de dados
## 
## Anexando pacote: 'dplyr'
## Os seguintes objetos são mascarados por 'package:stats':
## 
##     filter, lag
## Os seguintes objetos são mascarados por 'package:base':
## 
##     intersect, setdiff, setequal, union
library(forcats)

# Ler base de dados -------------------------------------------------------
top10 <- import("Tab_mais_freq.csv")
# Tabela original com todos os municipios ---------------------------------
tab_original <- top10 %>%
  select (municipio, desfecho) %>%
  tbl_summary (
    by = desfecho, 
    sort = list(municipio = "frequency"), # ordena por freq
    statistic = list(all_categorical() ~ "{n} ({p}%)"),
    digits = all_continuous() ~ 2,
  ) %>%
  modify_header(label ~ "**Características**") %>%
  bold_labels() %>% italicize_levels() %>%
  add_overall(col_label = "Total", last = F) %>%
  add_p(
    pvalue_fun = function(x)
      style_pvalue(x, digits = 3)
  )

tab_original
Características Total1 MELHORADA
N = 190
1
ÓBITO
N = 16
1
p-value2
municipio


0.295
    BELÉM 64 (31%) 62 (33%) 2 (13%)
    ANANINDEUA 26 (13%) 24 (13%) 2 (13%)
    CASTANHAL 9 (4.4%) 7 (3.7%) 2 (13%)
    MOJÚ 8 (3.9%) 5 (2.6%) 3 (19%)
    BENEVIDES 7 (3.4%) 6 (3.2%) 1 (6.3%)
    ICOARACI 6 (2.9%) 5 (2.6%) 1 (6.3%)
    PARAGOMINAS 6 (2.9%) 5 (2.6%) 1 (6.3%)
    BARCARENA 5 (2.4%) 5 (2.6%) 0 (0%)
    BRAGANÇA 5 (2.4%) 5 (2.6%) 0 (0%)
    MUANÁ 5 (2.4%) 5 (2.6%) 0 (0%)
    CAPANEMA 4 (1.9%) 3 (1.6%) 1 (6.3%)
    MARITUBA 4 (1.9%) 4 (2.1%) 0 (0%)
    ABAETETUBA 3 (1.5%) 3 (1.6%) 0 (0%)
    OEIRAS 3 (1.5%) 3 (1.6%) 0 (0%)
    SÃO MIGUEL 3 (1.5%) 3 (1.6%) 0 (0%)
    BAGRE 2 (1.0%) 0 (0%) 2 (13%)
    BREVES 2 (1.0%) 2 (1.1%) 0 (0%)
    CONCÓRDIA DO PARÁ 2 (1.0%) 2 (1.1%) 0 (0%)
    IGARAPÉ MIRIM 2 (1.0%) 2 (1.1%) 0 (0%)
    INHANGAPI 2 (1.0%) 2 (1.1%) 0 (0%)
    MARACANÃ 2 (1.0%) 2 (1.1%) 0 (0%)
    MEDICILÂNDIA 2 (1.0%) 1 (0.5%) 1 (6.3%)
    MOCAJUBA 2 (1.0%) 2 (1.1%) 0 (0%)
    NOVO REPARTIMENTO 2 (1.0%) 2 (1.1%) 0 (0%)
    TOMÉ AÇÚ 2 (1.0%) 2 (1.1%) 0 (0%)
    ULIANÓPOLIS 2 (1.0%) 2 (1.1%) 0 (0%)
    ACARÁ 1 (0.5%) 1 (0.5%) 0 (0%)
    ANAPÚ 1 (0.5%) 1 (0.5%) 0 (0%)
    AUGUSTO CORREA 1 (0.5%) 1 (0.5%) 0 (0%)
    AURORA DO PARÁ 1 (0.5%) 1 (0.5%) 0 (0%)
    CAMETÁ 1 (0.5%) 1 (0.5%) 0 (0%)
    CURRALINHO 1 (0.5%) 1 (0.5%) 0 (0%)
    CURUÇÁ 1 (0.5%) 1 (0.5%) 0 (0%)
    IGARAPÉ AÇÚ 1 (0.5%) 1 (0.5%) 0 (0%)
    IPIXUNA 1 (0.5%) 1 (0.5%) 0 (0%)
    LIMOEIRO DO AJURU 1 (0.5%) 1 (0.5%) 0 (0%)
    MÃE DO RIO 1 (0.5%) 1 (0.5%) 0 (0%)
    OURÉM 1 (0.5%) 1 (0.5%) 0 (0%)
    OURILÂNDIA 1 (0.5%) 1 (0.5%) 0 (0%)
    PAU D'ARCO 1 (0.5%) 1 (0.5%) 0 (0%)
    PEIXE BOI 1 (0.5%) 1 (0.5%) 0 (0%)
    PONTA DE PEDRAS 1 (0.5%) 1 (0.5%) 0 (0%)
    PORTEL 1 (0.5%) 1 (0.5%) 0 (0%)
    PORTO DE MOZ 1 (0.5%) 1 (0.5%) 0 (0%)
    SANTA IZABEL 1 (0.5%) 1 (0.5%) 0 (0%)
    SANTA LUZIA DO PARÁ 1 (0.5%) 1 (0.5%) 0 (0%)
    SANTA MARIA DAS BARREIRAS 1 (0.5%) 1 (0.5%) 0 (0%)
    SANTO ANTONIO 1 (0.5%) 1 (0.5%) 0 (0%)
    SÃO DOMINGOS DO CAPIM 1 (0.5%) 1 (0.5%) 0 (0%)
    SOURE 1 (0.5%) 1 (0.5%) 0 (0%)
    TERRA ALTA 1 (0.5%) 1 (0.5%) 0 (0%)
    TRACAUATEUA 1 (0.5%) 1 (0.5%) 0 (0%)
1 n (%)
2 Fisher’s exact test
# Classificar uma nova variável "municipio1" para manter apenas as top 6
# Usamos 'fct_lump_n()' do pacote 'forcats' 
# para agrupar as menos frequentes em "Outros"

dados_processados <- top10 %>%
  mutate(
    # Primeiro, agrupe as menos frequentes em "Outros"
    municipio1 = fct_lump_n(municipio, n = 6, 
                                    other_level = "Outros", 
                                    ties.method = "last"),
    # Segundo, reordene os níveis do fator por frequência descendente
    # A função fct_infreq() ordena os níveis de um fator pela sua frequência,
    # da mais comum para a menos comum.
    municipio1 = fct_infreq(municipio1),
    # Defina que a resposta outros ficara por ultimo
    municipio1 = fct_relevel(municipio1, "Outros", after = Inf)
  )


# 3. Criar a tabela de frequência com gtsummary
#    Agora usamos a nova variável 'sua_variavel_top10'
tab_top10 <- dados_processados %>%
  select (municipio1, desfecho) %>%
  tbl_summary (
    by = desfecho, 
    statistic = list(all_categorical() ~ "{n} ({p}%)"),
    digits = all_continuous() ~ 2,
  ) %>%
  modify_header(label ~ "**Características**") %>%
  bold_labels() %>% italicize_levels() %>%
  add_overall(col_label = "Total", last = F) %>%
  add_p(
    pvalue_fun = function(x)
      style_pvalue(x, digits = 3)
  )

tab_top10
Características Total1 MELHORADA
N = 190
1
ÓBITO
N = 16
1
p-value2
municipio1


0.013
    BELÉM 64 (31%) 62 (33%) 2 (13%)
    ANANINDEUA 26 (13%) 24 (13%) 2 (13%)
    CASTANHAL 9 (4.4%) 7 (3.7%) 2 (13%)
    MOJÚ 8 (3.9%) 5 (2.6%) 3 (19%)
    BENEVIDES 7 (3.4%) 6 (3.2%) 1 (6.3%)
    PARAGOMINAS 6 (2.9%) 5 (2.6%) 1 (6.3%)
    Outros 86 (42%) 81 (43%) 5 (31%)
1 n (%)
2 Fisher’s exact test