forcats, forcats, vous avez dit forcats ?

Hello there have you heard of forcats ? (mème)
Auteur : Colin Fay
Tags : Actualités, Ressources
Date :

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 😉


Commentaires

Une réponse à “forcats, forcats, vous avez dit forcats ?”

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *


À lire également

Nos formations Certifiantes à R sont finançables à 100% via le CPF

Nos formations disponibles via moncompteformation.gouv.fr permettent de délivrer des Certificats reconnues par l’état, enregistrées au répertoire spécifique de France Compétences. 3 niveaux de certifications existent :

Contactez-nous pour en savoir plus.