La “dream team” du tidyverse se compose de 6 packages, qui se lancent avec library(tidyverse)
: {ggplot2}, {dplyr}, {tidyr}, {reader}, {purrr} et {tibble}. Pourtant, si on lit dans les petites lignes, le tidyverse regorge d’autres outils incontournables. Parmi eux : {forcats}, sujet de notre billet d’aujourd’hui.
À ne pas confondre avec {forecast} (pour travailler avec des séries temporelles), {forcats} se destine à une gestion simplifiée des facteurs, autrement dit des valeurs catégorielles… “a package [for cat]egorical variables”. (C’est bon, vous l’avez ? 😉 ). Sans oublier : il s’agit d’une anagramme de factors !
R et les facteurs
Bon, commençons par rappeler rapidement ce qu’est un facteur : il s’agit d’un type de variable qui peut prendre comme valeur un nombre fini de modalités. Autrement dit, une variable est considérée comme facteur lorsqu’elle ne peut pas être mesurée directement par un nombre continu : par exemple, une couleur, un métier, une ville, un statut marital… Un facteur peut être ordonné (non satisfait, moyennement satisfait, satisfait, très satisfait) ou non (Paris, Rennes, Montpellier).
L’usage des facteurs en statistiques n’est pas d’hier : vous vous en doutez donc, son utilisation dans R date également. C’est d’ailleurs le comportement historique de R : traiter les chaînes de caractères comme des facteurs, avec l’option stringsAsFactors
, câblée sur TRUE
par défaut. Car oui, “back in the days”, ce comportement faisait sens : en statistiques, les strings sont majoritairement des facteurs. Si nous devons creuser un peu plus, nous pouvons aussi nous rappeler que, en background, R transforme les facteurs en représentations numériques : par exemple, “marié / non marié” sera converti en 1 et 2. Ce qui, en bout de course, fait gagner de la place, les chiffres demandant moins de bytes que les chaînes de caractères :
[pastacode lang=”R” manual=”object.size(1)%0A48%20bytes” message=”” highlight=”” provider=”manual”/]
[pastacode lang=”R” manual=”object.size(%22une_modalite_encode_avec_un_nom_super_long%22)%0A136%20bytes” message=”” highlight=”” provider=”manual”/]
Un comportement qui en fait aujourd’hui bondir plus d’un, et ne manque pas de faire couler de l’encre, tant dans la littérature que sur les blogs et sur Twitter. Mais bref, nous ne sommes pas ici pour relancer le débat, et avouons le, en stats, les facteurs sont indispensables. Alors, comment les manipuler dans le tidyverse ?
forcats pas-à-pas
[pastacode lang=”R” manual=”%23%20Si%20besoin%20%0A%23%20install.packages(%22forcats%22)%20%0A%23%20ou%2C%20pour%20%C3%AAtre%20plus%20tranquille%20%3A%0A%23%20install.packages(%22tidyverse%22)%0Alibrary(forcats)%0Alibrary(tidyverse)” message=”” highlight=”” provider=”manual”/]
Jouons d’abord avec le jeu de données storms
, disponible dans {dplyr}. Nativement, les datasets de ce package sont des tibbles, et les colonnes contenant des strings sont des caractères. C’est le cas par exemple de status
.
[pastacode lang=”R” manual=”storms%20%25%3E%25%0A%20%20count(status)%20%0A%23%20A%20tibble%3A%203%20x%202%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20status%20%20%20%20%20n%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cchr%3E%20%3Cint%3E%0A1%20%20%20%20%20%20%20%20%20%20%20hurricane%20%203091%0A2%20tropical%20depression%20%202545%0A3%20%20%20%20%20%20tropical%20storm%20%204374″ message=”” highlight=”” provider=”manual”/]
On voit ici qu’il s’agit d’une variable factorielle. Bien, “time to change”!
as_factor
Première fonction du package, as_factor
, utilisée pour transformer un vecteur en facteur. Quelle différence avec {base} ? La version {forcats} créer les niveaux du facteur en fonction de leur apparition dans le jeu de données, à l’inverse de {base}, qui trie en fonction de la configuration de votre locale (et donc, peut donner lieu à des différences d’une machine à l’autre).
Par exemple :
[pastacode lang=”R” manual=”x%20%3C-%20c(%22a%22%2C%20%22z%22%2C%20%22g%22)%0Aas_factor(x)%0A%5B1%5D%20a%20z%20g%0ALevels%3A%20a%20z%20g%0A%0Aas.factor(x)%0A%5B1%5D%20a%20z%20g%0ALevels%3A%20a%20g%20z” message=”” highlight=”” provider=”manual”/]
Ici, on voit bien que le premier imprime un ordre a z g, là où le second affiche a g z, en fonction de l’ordre alphabétique (qui n’est pas le même partout, rappelons-le).
[pastacode lang=”R” manual=”storms%20%3C-%20storms%20%25%3E%25%0A%20%20mutate(status%20%3D%20as_factor(status))” message=”” highlight=”” provider=”manual”/]
Bon, nous n’avons pas assez de modalités (3), pour pouvoir vraiment manipuler des facteurs… Testons plutôt le jeu de données natif de {forcats}, gss_cat
, contenant un sample du General Social Survey.
fct_anon
Si, par exemple, vous bossez dans la recherche médicale, l’anonymisation est primordiale (on vous en parlait déjà ici : forcément, il y a une fonction pour ça !
[pastacode lang=”R” manual=”gss_cat%20%25%3E%25%0A%20%20mutate(relig%20%3D%20fct_anon(relig))%20%25%3E%25%0A%20%20group_by(relig)%20%25%3E%25%0A%20%20count%0A%0A%23%20A%20tibble%3A%2015%20x%202%0A%23%20Groups%3A%20%20%20relig%20%5B15%5D%0A%20%20%20%20relig%20%20%20%20%20n%0A%20%20%20%3Cfctr%3E%20%3Cint%3E%0A%201%20%20%20%20%2002%20%20%20%2093%0A%202%20%20%20%20%2003%20%20%20689%0A%203%20%20%20%20%2004%20%20%20%2015%0A%204%20%20%20%20%2005%20%20%20%2071%0A%205%20%20%20%20%2006%20%205124%0A%206%20%20%20%20%2007%20%20%20224%0A%207%20%20%20%20%2008%20%20%20%2032%0A%208%20%20%20%20%2009%2010846%0A%209%20%20%20%20%2010%20%20%20104%0A10%20%20%20%20%2011%20%203523%0A11%20%20%20%20%2012%20%20%20109%0A12%20%20%20%20%2013%20%20%20388%0A13%20%20%20%20%2014%20%20%20%2095%0A14%20%20%20%20%2015%20%20%20%2023%0A15%20%20%20%20%2016%20%20%20147″ message=”” highlight=”” provider=”manual”/]
fct_c
Vous avez utilisé R plus d’une journée, vous connaissez forcément l’opérateur c
, indispensable pour concaténer des vecteurs les uns avec les autres. L’équivalent dans {forcats} est fct_c
, et vous permet de concaténer les facteurs de la même manière, là où {base} vous renvoie la version “integer” de vos facteurs :
[pastacode lang=”R” manual=”fac_a%20%3C-%20factor(c(%22a%22%2C%20%22b%22))%0Afac_b%20%3C-%20factor(c(%22c%22%2C%20%22d%22))%0Ac(fac_a%2C%20fac_b)%0A%5B1%5D%201%202%201%202%0Afct_c(fac_a%2C%20fac_b)%0A%5B1%5D%20a%20b%20c%20d%0ALevels%3A%20a%20b%20c%20d” message=”” highlight=”” provider=”manual”/]
fct_collapse
Cette fonction transforme les niveaux d’un facteur, soit pour les renommer soit pour les regrouper :
[pastacode lang=”R” manual=”gss_cat%20%25%3E%25%0A%20%20mutate(relig%20%3D%20fct_collapse(relig%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20no_answer%20%3D%20c(%22No%20answer%22%2C%20%22Don’t%20know%22%2C%20%22Not%20applicable%22%2C%20%22None%22)))%20%25%3E%25%0A%20%20group_by(relig)%20%25%3E%25%0A%20%20count%0A%0A%23%20A%20tibble%3A%2013%20x%202%0A%23%20Groups%3A%20%20%20relig%20%5B13%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20relig%20%20%20%20%20n%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cfctr%3E%20%3Cint%3E%0A%201%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20no_answer%20%203631%0A%202%20Inter-nondenominational%20%20%20109%0A%203%20%20%20%20%20%20%20%20%20Native%20american%20%20%20%2023%0A%204%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Christian%20%20%20689%0A%205%20%20%20%20%20%20Orthodox-christian%20%20%20%2095%0A%206%20%20%20%20%20%20%20%20%20%20%20%20Moslem%2Fislam%20%20%20104%0A%207%20%20%20%20%20%20%20%20%20%20%20Other%20eastern%20%20%20%2032%0A%208%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Hinduism%20%20%20%2071%0A%209%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Buddhism%20%20%20147%0A10%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Other%20%20%20224%0A11%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Jewish%20%20%20388%0A12%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Catholic%20%205124%0A13%20%20%20%20%20%20%20%20%20%20%20%20%20%20Protestant%2010846″ message=”” highlight=”” provider=”manual”/]
fct_count
Une fonction pour compter les entrées dans un facteur. Un équivalent à table
de {base} :
[pastacode lang=”R” manual=”gss_cat%20%25%3E%25%20%0A%20%20pull(marital)%20%25%3E%25%0A%20%20fct_count()%0A%0A%23%20A%20tibble%3A%206%20x%202%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%20%20%20%20%20n%0A%20%20%20%20%20%20%20%20%20%3Cfctr%3E%20%3Cint%3E%0A1%20%20%20%20%20No%20answer%20%20%20%2017%0A2%20Never%20married%20%205416%0A3%20%20%20%20%20Separated%20%20%20743%0A4%20%20%20%20%20%20Divorced%20%203383%0A5%20%20%20%20%20%20%20Widowed%20%201807%0A6%20%20%20%20%20%20%20Married%2010117″ message=”” highlight=”” provider=”manual”/]
fct_drop
Une fonction qui est là pour vous débarrasser des niveaux de facteurs inutilisés. La différence avec droplevels
? Les valeurs NA ne sont pas retirée ! Vous pouvez aussi sélectionner les modalités à faire disparaître.
[pastacode lang=”R” manual=”gss_status%20%3C-%20factor(gss_cat%24marital%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20levels%20%3Dc(%22No%20answer%22%2C%20%22Never%20married%22%2C%20%22Separated%22%2C%20%22Divorced%22%2C%22Widowed%22%2C%20%22Married%22%2C%20%22plop%22%2C%20%22ploum%22))%0Agss_status%20%25%3E%25%20fct_count()%0A%0A%23%20A%20tibble%3A%208%20x%202%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%20%20%20%20%20n%0A%20%20%20%20%20%20%20%20%20%3Cfctr%3E%20%3Cint%3E%0A1%20%20%20%20%20No%20answer%20%20%20%2017%0A2%20Never%20married%20%205416%0A3%20%20%20%20%20Separated%20%20%20743%0A4%20%20%20%20%20%20Divorced%20%203383%0A5%20%20%20%20%20%20%20Widowed%20%201807%0A6%20%20%20%20%20%20%20Married%2010117%0A7%20%20%20%20%20%20%20%20%20%20plop%20%20%20%20%200%0A8%20%20%20%20%20%20%20%20%20ploum%20%20%20%20%200%0A%0Agss_status%20%25%3E%25%20fct_drop()%20%25%3E%25%20fct_count()%0A%0A%23%20A%20tibble%3A%206%20x%202%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%20%20%20%20%20n%0A%20%20%20%20%20%20%20%20%20%3Cfctr%3E%20%3Cint%3E%0A1%20%20%20%20%20No%20answer%20%20%20%2017%0A2%20Never%20married%20%205416%0A3%20%20%20%20%20Separated%20%20%20743%0A4%20%20%20%20%20%20Divorced%20%203383%0A5%20%20%20%20%20%20%20Widowed%20%201807%0A6%20%20%20%20%20%20%20Married%2010117%0A%0A%23%20Avec%20only%2C%20vous%20pouvez%20ne%20droper%20que%20certains%20facteurs%0A%0Agss_status%20%25%3E%25%20fct_drop(only%20%3D%20%22plop%22)%20%25%3E%25%20fct_count()%0A%0A%23%20A%20tibble%3A%207%20x%202%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%20%20%20%20%20n%0A%20%20%20%20%20%20%20%20%20%3Cfctr%3E%20%3Cint%3E%0A1%20%20%20%20%20No%20answer%20%20%20%2017%0A2%20Never%20married%20%205416%0A3%20%20%20%20%20Separated%20%20%20743%0A4%20%20%20%20%20%20Divorced%20%203383%0A5%20%20%20%20%20%20%20Widowed%20%201807%0A6%20%20%20%20%20%20%20Married%2010117%0A7%20%20%20%20%20%20%20%20%20ploum%20%20%20%20%200%0A” message=”” highlight=”” provider=”manual”/]
fct_expand
Vous avez besoin d’ajouter de nouveaux niveaux à votre facteur ? Direction fct_expand
(oui oui, exactement ce que nous venons de faire juste au-dessus) :
[pastacode lang=”R” manual=”gss_cat%20%25%3E%25%0A%20%20pull(marital)%20%25%3E%25%0A%20%20fct_expand(%22plop%22%2C%20%22ploum%22)%20%25%3E%25%0A%20%20fct_count()%0A%0A%23%20A%20tibble%3A%208%20x%202%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%20%20%20%20%20n%0A%20%20%20%20%20%20%20%20%20%3Cfctr%3E%20%3Cint%3E%0A1%20%20%20%20%20No%20answer%20%20%20%2017%0A2%20Never%20married%20%205416%0A3%20%20%20%20%20Separated%20%20%20743%0A4%20%20%20%20%20%20Divorced%20%203383%0A5%20%20%20%20%20%20%20Widowed%20%201807%0A6%20%20%20%20%20%20%20Married%2010117%0A7%20%20%20%20%20%20%20%20%20%20plop%20%20%20%20%200%0A8%20%20%20%20%20%20%20%20%20ploum%20%20%20%20%200″ message=”” highlight=”” provider=”manual”/]
fct_explicit_na
Cette fonction vous permet de rendre les NA explicites, autrement dit de les faire apparaître dans votre jeu de données. Ce que ne fait pas table
, qui par défaut n’affiche pas les NA : explicit_NA
les transforme en (Missing)
, afin de les faire ressortir dans le classement.
[pastacode lang=”R” manual=”gss_cat%20%25%3E%25%0A%20%20pull(marital)%20%25%3E%25%0A%20%20fct_c(factor(x%20%3D%20c(NA%2CNA%2CNA)))%20%25%3E%25%0A%20%20table()%0A%20%20%20%20No%20answer%20Never%20married%20%20%20%20%20Separated%20%20%20%20%20%20Divorced%20%20%20%20%20%20%20Widowed%20%0A%20%20%20%20%20%20%20%20%20%20%2017%20%20%20%20%20%20%20%20%20%205416%20%20%20%20%20%20%20%20%20%20%20743%20%20%20%20%20%20%20%20%20%203383%20%20%20%20%20%20%20%20%20%201807%20%0A%20%20%20%20%20%20Married%20%0A%20%20%20%20%20%20%20%2010117%20%0A%20%20%20%20%20%20%20%20%0Agss_cat%20%25%3E%25%0A%20%20pull(marital)%20%25%3E%25%0A%20%20fct_c(factor(x%20%3D%20c(NA%2CNA%2CNA)))%20%25%3E%25%0A%20%20fct_explicit_na()%20%25%3E%25%0A%20%20table()%0A%20%20%20%20No%20answer%20Never%20married%20%20%20%20%20Separated%20%20%20%20%20%20Divorced%20%20%20%20%20%20%20Widowed%20%0A%20%20%20%20%20%20%20%20%20%20%2017%20%20%20%20%20%20%20%20%20%205416%20%20%20%20%20%20%20%20%20%20%20743%20%20%20%20%20%20%20%20%20%203383%20%20%20%20%20%20%20%20%20%201807%20%0A%20%20%20%20%20%20Married%20%20%20%20%20(Missing)%20%0A%20%20%20%20%20%20%20%2010117%20%20%20%20%20%20%20%20%20%20%20%20%203%20″ message=”” highlight=”” provider=”manual”/]
(Missing)
est la valeur par défaut donnée aux données manquantes, mais rassurez-vous : vous pouvez modifier leur petit nom :
[pastacode lang=”R” manual=”gss_cat%20%25%3E%25%0A%20%20pull(marital)%20%25%3E%25%0A%20%20fct_c(factor(x%20%3D%20c(NA%2CNA%2CNA)))%20%25%3E%25%0A%20%20fct_explicit_na(na_level%20%3D%20%22(Pauvres%20petites%20NA)%20%22)%20%25%3E%25%0A%20%20table()%0A%0A%20%20%20%20%20%20%20%20%20%20%20No%20answer%20%20%20%20%20%20%20%20%20Never%20married%20%20%20%20%20%20%20%20%20%20%20%20%20Separated%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2017%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%205416%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20743%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20Divorced%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Widowed%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Married%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%203383%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%201807%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2010117%20%0A(Pauvres%20petites%20NA)%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%203%20%20″ message=”” highlight=”” provider=”manual”/]
fct_infreq et fct_inorder
Ces deux fonctions sont là pour réordonner les facteurs selon leur fréquence, ou en fonction de leur apparition dans le jeu de données. Le paramètre ordered
indique si oui ou non, les facteurs sont… ordonnés (unbielievable, n’est-il pas ? 😉 ).
[pastacode lang=”R” manual=”gss_cat%20%25%3E%25%0A%20%20pull(marital)%0A…%0ALevels%3A%20No%20answer%20Never%20married%20Separated%20Divorced%20Widowed%20Married%0A%0Agss_cat%20%25%3E%25%0A%20%20pull(marital)%20%25%3E%25%20%0A%20%20fct_infreq()%0A…%0ALevels%3A%20Married%20Never%20married%20Divorced%20Widowed%20Separated%20No%20answer%0A%0Agss_cat%20%25%3E%25%0A%20%20pull(marital)%20%25%3E%25%20%0A%20%20fct_inorder(ordered%20%3D%20TRUE)%0A…%0ALevels%3A%20Never%20married%20%3C%20Divorced%20%3C%20Widowed%20%3C%20Married%20%3C%20Separated%20%3C%20No%20answer” message=”” highlight=”” provider=”manual”/]
fct_lump
Vous avez besoin de grouper les facteurs les plus communs ? Les plus rares ? Il y a une fonction pour ça ! Laissez-nous vous présenter fct_lump
:
[pastacode lang=”R” manual=”%23%20Avec%20n%20positif%2C%20la%20fonction%20conserve%20les%20n%20facteurs%20les%20plus%20courants%0Agss_cat%20%25%3E%25%0A%20%20pull(relig)%20%25%3E%25%0A%20%20fct_lump(n%20%3D%202)%20%25%3E%25%20%0A%20%20levels()%0A%5B1%5D%20%22Catholic%22%20%20%20%22Protestant%22%20%22Other%22%20%20%20%20%20%0A%0A%23%20Avec%20n%20n%C3%A9gatif%2C%20la%20fonction%20conserve%20les%20n%20facteurs%20les%20moins%20courants%0Agss_cat%20%25%3E%25%0A%20%20pull(relig)%20%25%3E%25%0A%20%20fct_lump(n%20%3D%20-2)%20%25%3E%25%20%0A%20%20levels()%0A%5B1%5D%20%22Don’t%20know%22%20%22Not%20applicable%22%20%22Other%22%20%20%20%20%20%0A%0A%23%20Avec%20prop%2C%20vous%20conservez%20les%20valeurs%20qui%20apparaissent%20au%20moins%20%22prop%20of%20the%20time%22%2C%20c’est-%C3%A0-dire%20que%20prop%20%3D%200.2%20conserve%20les%20facteurs%20qui%20repr%C3%A9sentent%20au%20moins%2020%25%20de%20votre%20vecteur.%0Agss_cat%20%25%3E%25%0A%20%20pull(relig)%20%25%3E%25%0A%20%20fct_lump(prop%20%3D%200.05)%20%25%3E%25%20%0A%20%20levels()%0A%5B1%5D%20%22None%22%20%22Catholic%22%20%20%20%22Protestant%22%20%22Other%22%20%20%0A%0A%23%20Avec%20un%20prop%20n%C3%A9gatif%2C%20on%20d%C3%A9finit%20une%20marge%20maximale%20d’apparition.%20%C3%80%20noter%20que%20vous%20pouvez%20d%C3%A9finir%20un%20%22Other%22%20%C3%A0%20votre%20gout%20avec%20other_level%0Agss_cat%20%25%3E%25%0A%20%20pull(relig)%20%25%3E%25%0A%20%20fct_lump(prop%20%3D%20-0.01%2C%20other_level%20%3D%20%22les_autres%22)%20%25%3E%25%20%0A%20%20levels()%0A%20%5B1%5D%20%22No%20answer%22%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Don’t%20know%22%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Inter-nondenominational%22%0A%20%5B4%5D%20%22Native%20american%22%20%20%20%20%20%20%20%20%20%22Orthodox-christian%22%20%20%20%20%20%20%22Moslem%2Fislam%22%20%20%20%20%20%20%20%20%20%20%20%0A%20%5B7%5D%20%22Other%20eastern%22%20%20%20%20%20%20%20%20%20%20%20%22Hinduism%22%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Buddhism%22%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%5B10%5D%20%22Not%20applicable%22%20%20%20%20%20%20%20%20%20%20%22les_autres%22%20%20%20″ message=”” highlight=”” provider=”manual”/]
fct_other
Vous avez envie de remplacer à la mano certaines modalités ? Go fct_other
! Cette fonction vous permet soit de garder une liste de niveaux, soit de droper. Les autres deviennent “other”.
[pastacode lang=”R” manual=”gss_cat%20%25%3E%25%0A%20%20pull(marital)%20%25%3E%25%20%0A%20%20fct_other(keep%20%3D%20%22Married%22)%20%25%3E%25%0A%20%20levels()%0A%5B1%5D%20%22Married%22%20%22Other%22%20%0A%0Agss_cat%20%25%3E%25%0A%20%20pull(marital)%20%25%3E%25%20%0A%20%20fct_other(drop%20%3D%20c(%22No%20answer%22%2C%22Never%20married%22))%20%25%3E%25%0A%20%20levels()%0A%5B1%5D%20%22Separated%22%20%22Divorced%22%20%20%22Widowed%22%20%20%20%22Married%22%20%20%20%22Other%22″ message=”” highlight=”” provider=”manual”/]
fct_recode
Aller, changer le niveau des facteurs à la main, ça vous branche ?
[pastacode lang=”R” manual=”gss_cat%20%25%3E%25%0A%20%20pull(marital)%20%25%3E%25%0A%20%20fct_recode(mar%20%3D%20%22Married%22%2C%20sep%20%3D%20%22Separated%22%2C%20wid%20%3D%20%22Widowed%22%2C%20no_a%20%3D%20%22No%20answer%22%2C%20nev%20%3D%20%22Never%20married%22%2C%20div%20%3D%20%22Divorced%22)%20%25%3E%25%0A%20%20levels()%0A%5B1%5D%20%22no_a%22%20%22nev%22%20%20%22sep%22%20%20%22div%22%20%20%22wid%22%20%20%22mar%22%20″ message=”” highlight=”” provider=”manual”/]
fct_relabel
Pour modifier le nom des niveaux de manière globale, fct_relabel
est là pour vous : en spécifiant une fonction qui agit sur une chaîne de caractères, tous vos labels sont affectés d’un coup ! Par exemple, mettons les noms en minuscule, et transformons les espaces en “_” :
[pastacode lang=”R” manual=”gss_cat%20%25%3E%25%0A%20%20pull(marital)%20%25%3E%25%0A%20%20fct_relabel(fun%20%3D%20tolower)%20%25%3E%25%0A%20%20fct_relabel(fun%20%3D%20stringr%3A%3Astr_replace_all%2C%20%22%20%22%2C%20%22_%22)%20%25%3E%25%0A%20%20levels()%0A%5B1%5D%20%22no_answer%22%20%20%20%20%20%22never_married%22%20%22separated%22%20%20%20%20%20%22divorced%22%20%20%20%20%20%20%22widowed%22%20%20%20%20%20%20%0A%5B6%5D%20%22married%22%20″ message=”” highlight=”” provider=”manual”/]
fct_relevel
Pour trier les facteurs à la main, plutôt que par ordre ou fréquence, comme nous avons vu plus haut. Si vous connaissez la version de {stats} (relevel
), il s’agit là d’une généralisation, utilisable avec plus d’un facteur.
[pastacode lang=”R” manual=”gss_cat%20%25%3E%25%0A%20%20pull(marital)%20%25%3E%25%0A%20%20fct_relevel(c(%22Never%20married%22%2C%20%22Married%22%2C%20%22Separated%22%2C%20%22Divorced%22%2C%20%22Widowed%22%2C%20%22No%20answer%22))%20%25%3E%25%0A%20%20levels()%0A%5B1%5D%20%22Never%20married%22%20%22Married%22%20%20%20%20%20%20%20%22Separated%22%20%20%20%20%20%22Divorced%22%20%20%20%20%20%20%22Widowed%22%20%20%20%20%20%20%0A%5B6%5D%20%22No%20answer%22%20%20″ message=”” highlight=”” provider=”manual”/]
fct_reorder et fct_reorder2
Houla, pourquoi deux fonctions pour réordonner des niveaux ? La première est utilisée lors d’une représentation graphique en 1 dimension, la seconde en 2D (eh oui, tout simplement). Imaginons que nous souhaitions visualiser le nombre moyen d’heures devant la télévision par statuts maritaux :
[pastacode lang=”R” manual=”library(ggplot2)%0A%0Agss_tv_hours%20%3C-%20gss_cat%20%25%3E%25%0A%20%20group_by(marital)%20%25%3E%25%0A%20%20summarise(age%20%3D%20mean(age%2C%20na.rm%20%3D%20TRUE)%2C%0A%20%20%20%20tvhours%20%3D%20round(mean(tvhours%2C%20na.rm%20%3D%20TRUE)%2C%201))%0A%0Agss_tv_hours%20%25%3E%25%0A%20%20ggplot(aes(tvhours%2C%20marital))%20%2B%20%0A%20%20geom_point()” message=”” highlight=”” provider=”manual”/]
Eh oui, ici y est ordonné en fonction du facteur marital. Ce que l’on veut, c’est qu’il soit ordonné par
tvhours.
[pastacode lang=”R” manual=”gss_tv_hours%20%25%3E%25%0A%20%20ggplot(aes(tvhours%2C%20fct_reorder(marital%2C%20tvhours)))%20%2B%20%0A%20%20geom_point()” message=”” highlight=”” provider=”manual”/]
fct_reorder_2
, vous sera utile lorsque vous avez besoin de mapper des couleurs sur une ligne : la légende se trouvera alignée à “l’arrivée” de vos lignes, sur la droite. Comment ça marche ? Les facteurs sont réordonnés avec la valeur y associée à la valeur la plus forte de x.
[pastacode lang=”R” manual=”age_relig%20%3C-%20gss_cat%20%25%3E%25%0A%20%20filter(!is.na(age))%20%25%3E%25%0A%20%20group_by(age%2C%20relig)%20%25%3E%25%0A%20%20count()%20%25%3E%25%0A%20%20ungroup()%20%25%3E%25%0A%20%20mutate(prop%20%3D%20n%20%2F%20sum(n))%0A%0Aggplot(age_relig%2C%20aes(age%2C%20prop%2C%20colour%20%3D%20relig))%20%2B%0A%20%20geom_line()%20″ message=”” highlight=”” provider=”manual”/]
Le problème ici ? Oui, la légende n’est pas dans le même ordre que les lignes… Eh bien, accueillez à bras ouverts
fct_reorder2
!
[pastacode lang=”R” manual=”ggplot(age_relig%2C%20aes(age%2C%20prop%2C%20colour%20%3D%20fct_reorder2(relig%2C%20age%2C%20prop)))%20%2B%0A%20%20geom_line()%20%2B%0A%20%20labs(colour%20%3D%20%22Religion%22)” message=”” highlight=”” provider=”manual”/]
fct_rev
Inverse l’ordre des facteurs… tout est dans le nom 😉
fct_shift
Décale les facteurs de n crans vers la gauche (et les premiers vont à la fin), ou vers la droite si n est négatif. Une fonction qui peut être utile sur des données cycliques, par exemple avec des dates ! Alors, si vous n’aimez pas la façon dont R ordonne les jours de la semaine :
[pastacode lang=”R” manual=”library(lubridate)%0Aw%20%3C-%20seq(from%20%3D%20ymd(%222017-01-01%22)%2C%20%0A%20%20%20%20%20%20%20%20%20to%20%3D%20ymd(%222017-01-31%22)%2C%20%0A%20%20%20%20%20%20%20%20%20by%20%3D%201)%20%25%3E%25%0A%20%20wday(label%20%3D%20TRUE)%0Alevels(w)%0A%5B1%5D%20%22Sun%22%20%20%20%22Mon%22%20%20%20%22Tues%22%20%20%22Wed%22%20%20%20%22Thurs%22%20%22Fri%22%20%20%20%22Sat%22%20%20″ message=”” highlight=”” provider=”manual”/]
Eh oui, ici la semaine commence le dimanche… Alors, comment changer ça ? Vous nous avez vus venir : avec fct_shift
[pastacode lang=”R” manual=”fct_shift(w%2C%201)%20%25%3E%25%20levels()%0A%5B1%5D%20%22Mon%22%20%20%20%22Tues%22%20%20%22Wed%22%20%20%20%22Thurs%22%20%22Fri%22%20%20%20%22Sat%22%20%20%20%22Sun%22%20″ message=”” highlight=”” provider=”manual”/]
fct_shuffle
Mélange de manière aléatoire les niveaux.
[pastacode lang=”R” manual=”fct_shuffle(w)%20%25%3E%25%20levels()%0A%5B1%5D%20%22Fri%22%20%20%20%22Tues%22%20%20%22Sat%22%20%20%20%22Thurs%22%20%22Mon%22%20%20%20%22Wed%22%20%20%20%22Sun%22%20″ message=”” highlight=”” provider=”manual”/]
fct_unify
Vous avez une liste de facteurs sous la main ? Pour les appliquer à tous les éléments, utilisez fct_unify
:
[pastacode lang=”R” manual=”plop%20%3C-%20list(w%2C%20factor(letters%5B1%3A5%5D))%0Afct_unify(plop)%0A%0A%5B%5B1%5D%5D%0A%20%5B1%5D%20Sun%20%20%20Mon%20%20%20Tues%20%20Wed%20%20%20Thurs%20Fri%20%20%20Sat%20%20%20Sun%20%20%20Mon%20%20%20Tues%20%20Wed%20%20%20Thurs%20Fri%20%20%0A%5B14%5D%20Sat%20%20%20Sun%20%20%20Mon%20%20%20Tues%20%20Wed%20%20%20Thurs%20Fri%20%20%20Sat%20%20%20Sun%20%20%20Mon%20%20%20Tues%20%20Wed%20%20%20Thurs%0A%5B27%5D%20Fri%20%20%20Sat%20%20%20Sun%20%20%20Mon%20%20%20Tues%20%0ALevels%3A%20Sun%20%3C%20Mon%20%3C%20Tues%20%3C%20Wed%20%3C%20Thurs%20%3C%20Fri%20%3C%20Sat%20%3C%20a%20%3C%20b%20%3C%20c%20%3C%20d%20%3C%20e%0A%0A%5B%5B2%5D%5D%0A%5B1%5D%20a%20b%20c%20d%20e%0ALevels%3A%20Sun%20Mon%20Tues%20Wed%20Thurs%20Fri%20Sat%20a%20b%20c%20d%20e” message=”” highlight=”” provider=”manual”/]
fct_unique
Enfin, dernier membre de la famille de fct_*
, cette fonction permet de renvoyer… les niveaux uniques d’un facteur. La différence avec base::unique
? fct_unique
renvoie les valeurs dans l’ordre de leur niveau, pas dans l’ordre de leur apparition.
[pastacode lang=”R” manual=”unique(gss_cat%24marital)%0A%5B1%5D%20Never%20married%20Divorced%20%20%20%20%20%20Widowed%20%20%20%20%20%20%20Married%20%20%20%20%20%20%20Separated%20%20%20%20%20No%20answer%20%20%20%20%0ALevels%3A%20No%20answer%20Never%20married%20Separated%20Divorced%20Widowed%20Married%0A%0Afct_unique(gss_cat%24marital)%0A%5B1%5D%20No%20answer%20%20%20%20%20Never%20married%20Separated%20%20%20%20%20Divorced%20%20%20%20%20%20Widowed%20%20%20%20%20%20%20Married%20%20%20%20%20%20%0ALevels%3A%20No%20answer%20Never%20married%20Separated%20Divorced%20Widowed%20Married” message=”” highlight=”” provider=”manual”/]
lvls_expand, lvls_reorder, lvls_revalue et lvls_union
Ces fonctions sont là pour vous travailler à plus bas niveau : dans la pratique, vous aurez plutôt besoin des fonctions que nous venons de voir plus haut. Mais bon, mettons-les ici quand même !
[pastacode lang=”R” manual=”f%20%3C-%20factor(c(%22a%22%2C%20%22b%22%2C%20%22c%22))%0A%23%20R%C3%A9ordonner%20par%20position%20%0Alvls_reorder(gss_cat%24marital%2C%206%3A1)%20%25%3E%25%20levels()%0A%5B1%5D%20%22Married%22%20%20%20%20%20%20%20%22Widowed%22%20%20%20%20%20%20%20%22Divorced%22%20%20%20%20%20%20%22Separated%22%20%20%20%20%20%22Never%20married%22%0A%5B6%5D%20%22No%20answer%22%20%20%20%0A%23%20R%C3%A9ordonner%20par%20valeur%0Alvls_revalue(gss_cat%24marital%2Cc(%22Widowed%22%2C%20%22Divorced%22%2C%22Separated%22%2C%22Never%20married%22%2C%20%22No%20answer%22%20%2C%20%22Married%22))%20%25%3E%25%20levels()%0A%5B1%5D%20%22Widowed%22%20%20%20%20%20%20%20%22Divorced%22%20%20%20%20%20%20%22Separated%22%20%20%20%20%20%22Never%20married%22%20%22No%20answer%22%20%20%20%20%0A%5B6%5D%20%22Married%22%20%20%20%0A%23%20Ajouter%20un%20nouveau%20facteur%0Alvls_expand(gss_cat%24marital%2C%20c(%22Widowed%22%2C%20%22Divorced%22%2C%22Separated%22%2C%22Never%20married%22%2C%20%22No%20answer%22%20%2C%20%22Married%22%2C%20%22Another%20level%22%2C%20%22And%20another%20one%22))%20%25%3E%25%20levels()%0A%5B1%5D%20%22Widowed%22%20%20%20%20%20%20%20%20%20%22Divorced%22%20%20%20%20%20%20%20%20%22Separated%22%20%20%20%20%20%20%20%22Never%20married%22%20%20%20%22No%20answer%22%20%20%20%20%20%20%0A%5B6%5D%20%22Married%22%20%20%20%20%20%20%20%20%20%22Another%20level%22%20%20%20%22And%20another%20one%22″ message=”” highlight=”” provider=”manual”/]
Et voilà, ce n’était pas de tout repos, mais nous avons parcouru tout {forcats} ! Maintenant, à vous de jouer 😉
[…] plus complet (et avec un vrai meme de chat -à ne pas confondre avec la mémère à chat-), c'est ici, sur le blog de ThinkR, que ça se […]