5  Fatores com FORCATS

5.1 Introdução

A seguir temos vários exemplos de tratamento de variáveis qualitativas o pacote FORCATS do R.

Para saber mais sobre este pacote, acesse:

https://cran.r-project.org/package=forcats.

Aviso

Para melhor utilizar este material, é importante que você tenha uma introdução à linguagem R e saiba carregar pacotes (packages) no R. Para mais informações acesse:

https://education.rstudio.com/learn/beginner/.

Para os exemplos, iremos carregar o seguinte pacote:

  • tidyverse
library (tidyverse)

5.1.1 Exemplos da Folha de Referência

A maioria dos exemplos, visam ajudar na interpretação dos exemplos e funções encontradas na Folha de Referência do forcats disponível no site do RStudio.


5.2 Introdução

Fatores são estruturas de dados da linguagem R utilizadas para representar variáveis qualitativas (categóricas). Apesar de todo o suporte da linguagem para este tipo de dados, o pacotes forcats facilita muito este trabalho, principalmente quando precisamos definir níveis, alterar sua ordem, etc.

Para uma breve explicação do que são variáveis qualitativas, também chamadas de categóricas, veja a seção: Tipos de Variáveis.

5.3 Base de Dados

Par os exemplos a seguir usaremos algumas tabelas já instaladas com o R ou o pacote tidyverse como:

gss_cat
diamonds  
starwars
PlantGrowth

Note que as variáveis do tipo fator são marcadas como “fct” nas tabelas acima.

5.4 Fatores

A linguagem R representa dados categóricos através de um tipo de dados chamado Fator (factor). Um fator é um vetor de inteiros com um atributo de nível (level) associado à ele. Este nível armazena um conjunto de mapeamentos entre o inteiro e o valor categórico. Quando você visualiza um fator, o R não mostra os inteiros, mas sim, os níveis associados à eles.

5.4.0.1 factor

Use esta função para criar um fator.

f <- factor(c("a", "c", "b", "a"), levels = c("a", "b", "c"))
f
[1] a c b a
Levels: a b c

No exemplos acima, criamos um fator à partir de um vetor (a,b,c,a) e definimos os níveis 1, 2 e 3 como “a,b,c”.

Nota

Se os níveis de um fator não forem especificados, o R irá pegar os caracteres únicos do vetor e colocá-los em ordem alfabética.

f <- factor(c("a", "c", "b", "a"))
f
[1] a c b a
Levels: a b c

5.4.0.2 as_fator

Podemos também converter um outro tipo de dado para fator utilzando a função as_factor.

vetor <- c("a", "b", "c", "a")
as_factor(vetor)
[1] a b c a
Levels: a b c

5.4.0.3 levels

Use para retornar ou definir os níveis de um fator.

# para retornar os níveis:
levels(f)
[1] "a" "b" "c"
# Para definir os níveis:
levels (f) <- c("x", "y", "z")
f
[1] x z y x
Levels: x y z
levels (f) <- c("a", "b", "c")
f
[1] a c b a
Levels: a b c

Veja outro exemplo:

f_meses <- factor(c("Jan", "Fev", "Mar", "Abr"))
f_meses
[1] Jan Fev Mar Abr
Levels: Abr Fev Jan Mar

Como não definimos os níveis do factor, ele colocou em ordem alfabética à partir dos valores definidos.

Para colocar os nível na ordem dos meses, podemos fazer:

meses <- c("Jan", "Fev", "Mar", "Abr")
levels (f_meses) <- meses
f_meses
[1] Mar Fev Abr Jan
Levels: Jan Fev Mar Abr
Dica

Estas configurações adequadas dos meses, são importantes em diversas ocasiões, dentre elas, quando precisamos gerar um gráfico com a variáveis categórica no GGPLOT, pois este leva em consideração os níveis para definir a ordem no gráfico.

5.5 Inspecionando Fatores

5.5.0.1 fct_count

Use para contar os valores de cada nível.

fct_count(f)

5.5.0.2 fct_match

Use para encontrar níveis.

fct_match(f, "a")
[1]  TRUE FALSE FALSE  TRUE

5.5.0.3 fct_unique

Use para retornar valores únicos de um fator, removendo os duplicados.

fct_unique(f)
[1] a b c
Levels: a b c

5.6 Combinando Fatores

5.6.0.1 fct_c

Use para combinar fatores com níveis diferentes.

f1 <- factor(c("a", "b", "c"))
f2 <- factor(c("b", "a"))
f1
[1] a b c
Levels: a b c
f2
[1] b a
Levels: a b
fct_c(f1,f2)
[1] a b c b a
Levels: a b c
Dica

Use fct_cross() para criar um fator à partir de dois ou mais fatores, gerando níveis para todas as combinações possíveis.

5.6.0.2 fct_unify

Use para padronizar os níveis à partir de uma lista de fatores.

list(f1, f2)
[[1]]
[1] a b c
Levels: a b c

[[2]]
[1] b a
Levels: a b
fct_unify(list(f2, f1))
[[1]]
[1] b a
Levels: a b c

[[2]]
[1] a b c
Levels: a b c

Veja que no exemplo acima, os níveis de ambas as listas agora possuem os mesmos valores.

5.7 Mudando as ordens dos Níveis

5.7.0.1 fct_relevel

Use para redefinir a ordem dos níveis.

fct_relevel(f, c("b", "c", "a"))
[1] a c b a
Levels: b c a

5.7.0.2 fct_reorder

Use para definir a ordem dos níveis, baseadas em outra variável. Ou seja, ela ordena os níveis de acordo com esta outra variável. Para explicar melhor, vamos criar um data frame (df) e definir a variavel color com fator:

df <- tibble::tribble(
  ~color,     ~a, ~b,
  "blue",      1,  2,
  "green",     6,  2,
  "purple",    3,  3,
  "red",       2,  3,
  "yellow",    5,  1
)

df$color <- factor(df$color)
df

Agora, vamos analisar os níveis de color e depois utilizar a função fct_order() para reordenar este níveis de acordo com os números definidos na variável “a”.

df$color
[1] blue   green  purple red    yellow
Levels: blue green purple red yellow
fct_reorder(df$color, df$a)
[1] blue   green  purple red    yellow
Levels: blue red purple yellow green

No próximo exemplo, utilzamos a função fct_reorder para ordenar os níveis da variável “group” em função dos valores da variável “weight”.

Veja como fica um gráfico de boxplot, sem e depois com os níveis reordenados:

#Sem ftc_reorder
PlantGrowth |> 
  ggplot(aes(group , weight, fill = group)) + 
  geom_boxplot()
#Com fct_reorder
PlantGrowth |> 
  ggplot(aes(fct_reorder(group, weight) , weight, fill = group)) + 
  geom_boxplot()

5.7.0.3 fct_reorder2

Use para definir a ordem do fator com base nos valores.

Ainda usando o data frame (df) criado visto na função fct_reorder, vejamos a diferença para utilizar o fct_reorder2(). Neste caso, utilizamos duas variáveis (a e b) para reordenar a variável color.

df 
fct_reorder2(df$color, df$a, df$b)
[1] blue   green  purple red    yellow
Levels: purple red blue green yellow

Em geral, utilzamos este tipo de reordenação de uma variável fator de acordo com duas variáveis, quando queremos visualizar uma estética não posicional em um gráfico, como color, size, fill, etc.

# Sem a reordenação de nível com fct_reorder2
diamonds |> 
  ggplot(aes(carat, 
             price, color = color)) + 
             #color = fct_reorder2 (color, carat, price))) + 
  geom_smooth()
# Com a reordenação de nível com fct_reorder2
diamonds |> 
  ggplot(aes(carat, 
             price, 
             color = fct_reorder2 (color, carat, price))) + 
  labs(color = "color")+
  geom_smooth()

5.7.0.4 fct_infreq

Use para reordenar os níveis de um fator, pela primeira ordem de frequência dos dados. Maior frequência aparece em primeiro.

f3 <- factor(c("c", "c", "a"))
fct_infreq(f3)
[1] c c a
Levels: c a
Dica

Se quiser reordenar os níveis usando os valores numéricos dos níveis, use fct_inseq().

5.7.0.5 fct_inorder

Use para reordenar os níveis de um fator, pela ordem de aparecimento dos dados na linhas.

f2
[1] b a
Levels: a b
fct_inorder(f2)
[1] b a
Levels: b a

5.7.0.6 fct_rev

Use para inverter a ordem dos níveis de um vetor.

f4 <- factor(c("a","b","c"))
f4
[1] a b c
Levels: a b c
fct_rev(f4)
[1] a b c
Levels: c b a

5.7.0.7 fct_shift

Use para deslocar a ordem dos níveis de um fator. Use o argumento n= para deslocar n casas.

f
[1] a c b a
Levels: a b c
fct_shift(f)
[1] a c b a
Levels: b c a

5.7.0.8 fct_shuffle

Use para embaralhar randomicamente dos níveis de um fator.

fct_shuffle(f4)
[1] a b c
Levels: c b a
fct_shuffle(f4)
[1] a b c
Levels: a b c

5.8 Mudando os valores dos Níveis

5.8.0.1 fct_recode

Use para mudar manualmente os valores dos níveis de um fator.

f
[1] a c b a
Levels: a b c
fct_recode(f, v = "a", x = "b", z = "c")
[1] v z x v
Levels: v x z

5.8.0.2 fct_relabel

Use para mudar programaticamente os nomes. Esta função aceita a sintaxe de funções do pacote purrr. Pode-se usar expressões regulares, etc.

fct_relabel(f, ~ paste0("x", .x))
[1] xa xc xb xa
Levels: xa xb xc

5.8.0.3 fct_anon

Use para anonimizar os valores dos níveis com números randômicos.

fct_anon(f)
[1] 2 3 1 2
Levels: 1 2 3

5.8.0.4 fct_collapse

Use para agrupar níveis definindo grupos manualmente.

f
[1] a c b a
Levels: a b c
fct_collapse(f, x = c("a", "b"))
[1] x c x x
Levels: x c

5.8.0.5 fct_lump_min

Use para agrupar em um único grupo os níveis de um fator que aparecem menos que n vezes.

f
[1] a c b a
Levels: a b c
fct_lump_min(f, min = 2)
[1] a     Other Other a    
Levels: a Other
Dica

Use o argumento other_level= para dar um nome defierente de “Other” quando precisar.

Este grupo de funções tem também:

fct_prop: Para agrupar em um único grupo valores com proporções menores que n% vezes.

fct_lowfreq: Para agrupar em um único grupo valores com as menores frequências, garantindo que o grupo “other” tem o menor nível.

fct_lump_n: Para agrupar em um único grupo valores exceto aqueles com o número de frequência maior que o argumento n=.

Veja mais um exemplo, mesclando vários conceitos que vimos até aqui, mas com foco nas funções fct_lummp_n() e fct_shift():

 starwars |> 
   drop_na()|> 
   ggplot(aes(
     fill = fct_lump_n(homeworld, n = 3),
     x = fct_shift(
                fct_lump_n(homeworld, n = 3,other_level = "Outros"), 
                n = -1L))) +
   scale_fill_brewer(palette = "Dark2", guide = "none") + 
   geom_bar()+
   geom_label(stat = "count", aes(label = after_stat(count)))+
   labs(x ="Mundo", y="Qtd de Personagens") + 
   coord_flip()

Veja que neste exemplo, pedimos para a funções fct_lump_n agrupar tudo em um grupo, exceto os 3 maiores grupos. Veja que tivemos 4 grupo + 1 “other” pois ouve um empate no terceiro grupo. Depois, como queríamos que o grupo “other” ficava abaixo do gráfico, optamos por deslocar em -1 inteiro a nível deste fator, fazendo com o primeiro nível fosse para o último lugar.

5.8.0.6 fct_other

Use para definir manualmente os níveis que irão pertecer ao grupo “other”.

f
[1] a c b a
Levels: a b c
fct_other(f, keep = c("a", "b"))
[1] a     Other b     a    
Levels: a b Other

5.9 Adicionando ou Removendo Níveis

5.9.0.1 fct_drop

Use para remover níveis que não estão sendo usados.

f5 <- factor(c("a","b"),c("a","b","x"))
f5
[1] a b
Levels: a b x
f6 <- fct_drop(f5)
f6
[1] a b
Levels: a b

5.9.0.2 fct_expand

Use para adicionar níveis a um fator.

fct_expand(f6, "x")
[1] a b
Levels: a b x

5.9.0.3 fct_explicit_na

Use para definir níveis “NA” como (Missing). Isto é útil quando quiser deixar explícito em gráficos os valores ausentes (Missings).

fct_explicit_na(factor(c("a", "b", NA)))
[1] a         b         (Missing)
Levels: a b (Missing)
tb <- tribble(~x, ~y,
        "A", 1,
        "A", 2,
        "A", 2,
        "B", 3,
        NA, NA,
        "D", 5,
        NA, NA,
        "D", 4,)

tb$x <- as_factor(tb$x)

tb |> ggplot(aes(x)) +
  geom_bar()
tb |> ggplot(aes(fct_explicit_na(x, na_level = "Sem Valores"))) +
  geom_bar()