O forcats
é um pacote bastante simples. Ele é composto por funções de apenas dois tipos:
fct_
, que recebem uma lista de fatores e devolvem um fator.fct_c
recebe uma lista de fatores e devolve um fator que é a união dos anteriores.fator_1 <- factor(c("a","b","c")) fator_2 <- factor(c("d","e")) fator_3_sem_sentido <- c(fator_1, fator_2) fator_3_sem_sentido fator_3_com_sentido <- forcats::fct_c(fator_1, fator_2) fator_3_com_sentido
lvl_
, que modificam os níveis de um fator.lvl_revalue
recebe um fator e um vetor de strings
com dimensão igual ao número de níveis do fator. Retorna o fator fornecido com o atributo levels
igual ao vetor de strings
fornecido.fator <- factor(c("a","b","c")) novos_niveis <- c("c", "b", "a") fator <- forcats::lvls_revalue(fator, novos_niveis)
Nesta seção, vamos estudar o funcionamento das principais funções do forcats
utilizando como motivação a visualização dos dados de uma base analisada pela Associação Brasileira de Jurimetria. A base foi simplificada para otimizar seu uso neste curso. Além disso, os dados passaram por um processo de anonimização, pois os resultados ainda não foram divulgados.
A base contém informações sobre uma amostra de vítimas de homicídios no município de São Paulo e é composta pelas seguintes variáveis:
instrumento.usado
: instrumento usado pelo crime.sexo.vítima
: sexo da vítima.idade.vítima
: idade da vítima.A tabela abaixo ilustra a distribuição dos valores da variável instrumento.usado
.
bd_enasp_abj %>% count(instrumento.usado) %>% arrange(desc(n)) %>% rename(`Frequência` = n) %>% knitr::kable(digits = 0)
Como existe uma grande variabilidade de instrumentos, vamos reclassificar a variável instrumento.usado
em um fator com níveis menos gerais.
Para realizar essa tarefa, vamos utilizar a função fct_collapse
e a função fct_lump
. A função fct_collapse
é uma generalização de uma outra função chamada fct_recode
. A função fct_collapse
recebe um fator e uma série nomeada de vetores de strings
, enquanto a função fct_recode
recebe um fator e uma série de strings
nomeadas. Já a função fct_lump
transforma os níveis menos frequentes de um fator em um nível "Outros".
Abaixo exemplificamos a utilização das três funções mencionadas no parágrafo anterior:
fator <- factor(c("a","a","a","b","b", "c", "d", "e")) fct_collapse(fator, b2 = c("b", "c"), a2 = c("a", "d")) fct_recode(fator, b2 = "b", b2 = "c", a2 = "a", a2 = "d") fct_lump(fator, 2, other_level = "Outros")
Voltando à nossa aplicação, vamos utilizar a função fct_collapse
para recodificar a variável instrumento.usado
. Após essa reclassificação, os níveis com poucas contagens serão convertidos em "Outros" por meio da função fct_lump
:
bd_enasp_abj <- bd_enasp_abj %>% mutate(instrumento.usado = fct_collapse(instrumento.usado, `Arma branca` = c("Faca", "Fio elétrico", "Fio elétrico (vítima foi estrangulada)", "Fogo"), `Arma de Fogo` = c("Pistola", "Revólver", "Arma de fogo","38")), instrumento.usado = fct_lump(instrumento.usado, 2, other_level = "Outros"))
Após a reclassificação a distribuição fica:
bd_enasp_abj %>% count(instrumento.usado) %>% knitr::kable()
Vamos visualizar a tabela anterior como um gráfico.
bd_enasp_abj %>% ggplot(aes(x = instrumento.usado, fill = instrumento.usado)) + geom_bar() + theme_bw(15) + xlab("Intrumento usado") + ylab("Frequência") + theme(legend.position = 'none')
A ordem das barras nesse gráfico não está muito intuitiva, pois uma arma de fogo é um instrumento de crime mais perigoso do que uma arma branca, mas o eixo das abscissas não transmite essa informação.
Alterar a relação de ordem entre os níveis de um fator pode ser feito de duas maneiras:
levels
.bd_teste <- bd_enasp_abj levels(bd_teste$instrumento.usado) <- c("Outros", "Arma branca", "Arma de Fogo") bd_teste %>% ggplot(aes(x = instrumento.usado, fill = instrumento.usado)) + geom_bar() + theme_bw(15) + xlab("Intrumento usado") + ylab("Frequência") + theme(legend.position = 'none')
Mudar diretamente os níveis também mudou as labels impressas! Mesmo que os níveis do novo fator bd_teste$instrumento.usado
estejam na ordem correta, os rótulos também foram alterados.
O problema da reordenação pode ser resolvido conforme ilustrado no código abaixo:
bd_teste <- bd_enasp_abj novos_niveis <- c("Outros", "Arma branca", "Arma de Fogo") bd_teste$instrumento.usado <- factor(bd_teste$instrumento.usado, novos_niveis) bd_teste %>% ggplot(aes(x = instrumento.usado, fill = instrumento.usado)) + geom_bar() + theme_bw(15) + xlab("Intrumento usado") + ylab("Frequência") + theme(legend.position = 'none')
No forcats
, a reordenação equivalente a criar o fator novamente pode ser feita de três maneiras:
lvl_reorder
, que reordena os níveis de um fator de acordo com um conjunto de índices. Recomenda-se o uso dessa função quando se quer reordenar os níveis de uma maneira facilmente parametrizável, como uma permutação dos índices dos níveis. Um exemplo comum é trocar a ordem dos níveis de crescente para decrescente.fator <- factor(letters) #altera a ordem dos fatores de crescente para decrescente lvls_reorder(fator, length(letters):1)
fct_reorder
e fct_reorder2
, que reordenam os níveis de um fator f
de acordo com a aplicação de uma função em um vetor (ou dois no caso de fct_reorder2
) agrupado por f
. Recomenda-se o uso dessa função quando se quer reordenar os níveis considerando os valores de uma outra variável ou resultado de um cálculo.fator <- factor(c("a","a","a","b","b","c")) vetor <- c(1,2,3,1,1,1.2) #ordena os níveis de acordo com a média da variável vetor em cada nível fct_reorder(fator, vetor, fun = mean)
fct_relevel
, que "puxa" os níveis de um fator para o começo do vetor de níveis.fator <- factor(c("a","a","a","b","b","c")) #"puxa" os níveis "b" e "c" para o começo fct_relevel(fator, "b","c")
Na nossa aplicação, podemos utilizar tanto a função lvls_reorder
quanto a função fct_relevel
. O gráfico resultante ordena os níveis de instrumento.usado como queríamos.
bd_enasp_abj %>% mutate(instrumento.usado = lvls_reorder(instrumento.usado, c(3, 2, 1))) %>% ggplot(aes(x = instrumento.usado, fill = instrumento.usado)) + geom_bar() + theme_bw(15) + xlab("Intrumento usado") + ylab("Frequência") + theme(legend.position = 'none')
Nesta sessão, vamos utilizar as funções para exemplificar utilizações do pacote forcats
para visualizações.
A visualização abaixo ordena os níveis de "instrumento.usado" de acordo com a mediana da idade das vítimas de homicídio.
bd_enasp_abj %>% mutate(instrumento.usado = fct_reorder(instrumento.usado, `idade.vítima`, fun = median)) %>% ggplot(aes(x = instrumento.usado, y = `idade.vítima`, fill = instrumento.usado)) + geom_boxplot() + theme_bw(15) + xlab("Intrumento usado") + ylab("Idade") + theme(legend.position = 'none')
A visualização abaixo exemplifica um caso em que a ordem dos facets foi invertida reordenando o fator sexo.vítima
.
bd_enasp_abj %>% mutate(instrumento.usado = fct_reorder(instrumento.usado, `idade.vítima`, fun = median), `sexo.vítima` = fct_recode(`sexo.vítima`, Homem = "M", Mulher = "F")) %>% ggplot(aes(x = instrumento.usado, y = `idade.vítima`, fill = instrumento.usado)) + geom_boxplot() + theme_bw(15) + xlab("Intrumento usado") + ylab("Idade") + facet_wrap(~`sexo.vítima`) + theme(legend.position = 'none')
bd_enasp_abj %>% mutate(instrumento.usado = fct_reorder(instrumento.usado, `idade.vítima`, fun = median), `sexo.vítima` = fct_recode(`sexo.vítima`, Homem = "M", Mulher = "F"), `sexo.vítima` = fct_relevel(`sexo.vítima`, "Homem", "Mulher")) %>% ggplot(aes(x = instrumento.usado, y = `idade.vítima`, fill = instrumento.usado)) + geom_boxplot() + theme_bw(15) + xlab("Intrumento usado") + ylab("Idade") + facet_wrap(~`sexo.vítima`) + theme(legend.position = 'none')
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.