library (tidyverse)
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.
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:
Para os exemplos, iremos carregar o seguinte pacote:
- 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.
<- factor(c("a", "c", "b", "a"), levels = c("a", "b", "c"))
f 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”.
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.
<- factor(c("a", "c", "b", "a"))
f 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.
<- c("a", "b", "c", "a")
vetor 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:
<- factor(c("Jan", "Fev", "Mar", "Abr"))
f_meses 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:
<- c("Jan", "Fev", "Mar", "Abr")
meses levels (f_meses) <- meses
f_meses
[1] Mar Fev Abr Jan
Levels: Jan Fev Mar Abr
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.
<- factor(c("a", "b", "c"))
f1 <- factor(c("b", "a")) f2
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
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:
<- tibble::tribble(
df ~color, ~a, ~b,
"blue", 1, 2,
"green", 6, 2,
"purple", 3, 3,
"red", 2, 3,
"yellow", 5, 1
)
$color <- factor(df$color)
df 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”.
$color df
[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,
color = color)) +
price, #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.
<- factor(c("c", "c", "a"))
f3 fct_infreq(f3)
[1] c c a
Levels: c a
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.
<- factor(c("a","b","c"))
f4 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
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.
<- factor(c("a","b"),c("a","b","x"))
f5 f5
[1] a b
Levels: a b x
<- fct_drop(f5)
f6 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)
<- tribble(~x, ~y,
tb "A", 1,
"A", 2,
"A", 2,
"B", 3,
NA, NA,
"D", 5,
NA, NA,
"D", 4,)
$x <- as_factor(tb$x)
tb
|> ggplot(aes(x)) +
tb geom_bar()
|> ggplot(aes(fct_explicit_na(x, na_level = "Sem Valores"))) +
tb geom_bar()