{"id":1234,"date":"2020-06-11T18:33:21","date_gmt":"2020-06-11T16:33:21","guid":{"rendered":"http:\/\/perso.ens-lyon.fr\/lise.vaudor\/?p=1234"},"modified":"2020-06-11T18:33:21","modified_gmt":"2020-06-11T16:33:21","slug":"janitor-nettoie-moi-cette-table-et-que-ca-brille","status":"publish","type":"post","link":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/janitor-nettoie-moi-cette-table-et-que-ca-brille\/","title":{"rendered":"Janitor: nettoie-moi cette table (et qu&rsquo;elle brille!)"},"content":{"rendered":"<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Janitor\/Lise_Vaudor_headband-1.png\" alt=\"\" \/><\/p>\n<p>Chers lecteurs, bonjour!<\/p>\n<p>Aujourd\u2019hui, je vais vous parler du package <code>janitor<\/code>, un package qui comprend notamment (mais pas seulement) un certain nombre de fonctions pour <strong>am\u00e9liorer vos tableaux de contingence<\/strong>. En Anglais, \u201cjanitor\u201d veut dire (plus ou moins) \u201chomme \u00e0 tout faire\u201d. Et en effet, outre les t\u00e2ches li\u00e9es \u00e0 la mise en forme de ces tableaux, le package <code>janitor<\/code> vise \u00e0 prendre en charge pour vous un <strong>certain nombre de t\u00e2ches aussi vari\u00e9es que p\u00e9nibles<\/strong>\u2026<\/p>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Janitor\/logo_small.png\" alt=\"\" \/><\/p>\n<p>Jetons un coup d\u2019oeil \u00e0 l\u2019ensemble des fonctions comprises dans ce package (je fais \u00e7a \u00e0 l\u2019aide de mon package flowrpowr (<a href=\"http:\/\/perso.ens-lyon.fr\/lise.vaudor\/certains-packages-sont-comme-des-fleurs\/\" class=\"uri\">http:\/\/perso.ens-lyon.fr\/lise.vaudor\/certains-packages-sont-comme-des-fleurs\/<\/a>):<\/p>\n<pre><code>library(janitor)\nlibrary(flowrpowr)\nflowrpowr::flowr_package(\"janitor\")\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Janitor\/unnamed-chunk-2-1.png\" alt=\"\" \/><\/p>\n<h1>Op\u00e9rations sur les tables de contingences<\/h1>\n<p>Les \u00e9l\u00e9ments apparaissant ci-dessous sont ceux relatifs aux <strong>tables de contingence<\/strong> (fonctions <code>tabyl<\/code> et consorts, fonctions de type <code>adorn_xxx()<\/code> &#8211;<code>adorn_title()<\/code>,<code>adorn_ns()<\/code>,<code>adorn_rounding()<\/code>,etc.-). Les autres fonctions sont toutes celles qui r\u00e9alisent des op\u00e9rations sur les donn\u00e9es (en g\u00e9n\u00e9ral, mais pas seulement, en lien avec le nettoyage de tableaux).<\/p>\n<pre><code>flowrpowr::flowr_package(\"janitor\", element=c(\"adorn\",\"tabyl\"))\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Janitor\/unnamed-chunk-3-1.png\" alt=\"\" \/><\/p>\n<p>La fonction <code>tabyl()<\/code> est, en quelque sorte, l\u2019\u00e9quivalent (am\u00e9lior\u00e9) de la fonction <code>table()<\/code>, qui compte des <strong>effectifs par classe<\/strong>. Mais l\u00e0 o\u00f9 <code>table()<\/code> travaille sur des vecteurs (ou facteurs), <code>tabyl()<\/code> prend <strong>pour premier argument un tableau de donn\u00e9es<\/strong>. C\u2019est peut-\u00eatre un d\u00e9tail pour vous, mais en fait \u00e7a veut dire beaucoup: c\u2019est le signe que le package <code>janitor<\/code> est \u201cpipe-compatible\u201d (et donc \u201cdplyr-compatible\u201d) (puisque le premier argument des fonctions est un jeu de donn\u00e9es, on peut encha\u00eener les op\u00e9rations \u00e0 l\u2019aide des \u201cpipes\u201d <code>%&gt;%<\/code>).<\/p>\n<p>Voyez plut\u00f4t:<\/p>\n<pre><code>tabyl(mtcars,cyl)  # en appel \"classique\"\n\n##  cyl  n percent\n##    4 11 0.34375\n##    6  7 0.21875\n##    8 14 0.43750\n\nmtcars %&gt;%\n  tabyl(cyl) # en appel \"pip\u00e9\"\n\n##  cyl  n percent\n##    4 11 0.34375\n##    6  7 0.21875\n##    8 14 0.43750\n<\/code><\/pre>\n<p>Remarquez en outre que, pour une variable, <code>tabyl()<\/code> vous affiche diligemment les <strong>proportions<\/strong> (<code>percent<\/code>) en plus des effectifs (<code>n<\/code>).<\/p>\n<p>Comme <code>table()<\/code>, <code>tabyl()<\/code> sait aussi compter des effectifs crois\u00e9s:<\/p>\n<pre><code>mtcars %&gt;% \n  tabyl(cyl,am)\n\n##  cyl  0 1\n##    4  3 8\n##    6  4 3\n##    8 12 2\n<\/code><\/pre>\n<p>L\u2019ensemble des fonctions <code>adorn_xxx()<\/code> vise \u00e0 <strong>mettre en forme les tableaux d\u2019effectifs<\/strong> produits par <code>tabyl()<\/code>.<\/p>\n<p>On peut par exemple rajouter une <strong>colonne correspondant aux effectifs totaux<\/strong>:<\/p>\n<pre><code>tab=mtcars %&gt;%\n  tabyl(gear, cyl) %&gt;%\n  adorn_totals(\"col\")\ntab\n\n##  gear 4 6  8 Total\n##     3 1 2 12    15\n##     4 8 4  0    12\n##     5 2 1  2     5\n<\/code><\/pre>\n<p>On peut afficher les <strong>pourcentages<\/strong> plut\u00f4t que les effectifs (ici <strong>pourcentages par ligne<\/strong>)<\/p>\n<pre><code>tab=tab %&gt;%\n  adorn_percentages(\"row\")\ntab\n\n##  gear          4         6   8 Total\n##     3 0.06666667 0.1333333 0.8     1\n##     4 0.66666667 0.3333333 0.0     1\n##     5 0.40000000 0.2000000 0.4     1\n<\/code><\/pre>\n<p>On peut <strong>limiter le nombre de digits<\/strong> dans l\u2019affichage:<\/p>\n<pre><code>tab=tab %&gt;% \n  adorn_pct_formatting(digits=2)\ntab\n\n##  gear      4      6      8   Total\n##     3  6.67% 13.33% 80.00% 100.00%\n##     4 66.67% 33.33%  0.00% 100.00%\n##     5 40.00% 20.00% 40.00% 100.00%\n<\/code><\/pre>\n<p>On peut afficher, en plus des pourcentages, les effectifs:<\/p>\n<pre><code>tab=tab %&gt;% \n  adorn_ns()\ntab\n\n##  gear          4          6           8        Total\n##     3  6.67% (1) 13.33% (2) 80.00% (12) 100.00% (15)\n##     4 66.67% (8) 33.33% (4)  0.00%  (0) 100.00% (12)\n##     5 40.00% (2) 20.00% (1) 40.00%  (2) 100.00%  (5)\n<\/code><\/pre>\n<p>On peut rajouter le nom de la deuxi\u00e8me variable:<\/p>\n<pre><code>tab=tab %&gt;% \n  adorn_title()\ntab\n\n##              cyl                                    \n##  gear          4          6           8        Total\n##     3  6.67% (1) 13.33% (2) 80.00% (12) 100.00% (15)\n##     4 66.67% (8) 33.33% (4)  0.00%  (0) 100.00% (12)\n##     5 40.00% (2) 20.00% (1) 40.00%  (2) 100.00%  (5)\n<\/code><\/pre>\n<p>Pour en savoir plus sur les fonctionnalit\u00e9s des \u201ctabyls\u201d, vous pouvez aller voir la vignette fournie par les auteurs de <code>janitor<\/code> (vous pouvez l\u2019ouvrir en faisant <code>vignette(\"tabyls\")<\/code> dans votre console une fois que vous avez install\u00e9 le package).<\/p>\n<h1>Nettoyage de tableaux de donn\u00e9es<\/h1>\n<p>Je ne vais pas aborder l\u2019ensemble des autres fonctions de <code>janitor<\/code>, mais, pour aller \u00e0 l\u2019essentiel, disons que ces fonctions r\u00e9alisent quelques t\u00e2ches \u201cde routine\u201d pour nettoyer les tableaux de donn\u00e9es. Par exemple:<\/p>\n<pre><code>flowrpowr::flowr_package(\"janitor\",element=c(\"compare|remove|clean|^round\"))\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Janitor\/unnamed-chunk-11-1.png\" alt=\"\" \/><\/p>\n<ul>\n<li>\n<p>les fonctions <code>remove_xxx()<\/code> <strong>retirent<\/strong> les <strong>colonnes qui contiennent une valeur constante<\/strong> (<code>remove_constant()<\/code>), ou les <strong>colonnes ou lignes compl\u00e8tement vides<\/strong> (<code>remove_empty_cols()<\/code>,<code>remove_empty_rows()<\/code>)<\/p>\n<\/li>\n<li>\n<p>les fonctions <code>compare_df_cols...()<\/code> <strong>comparent les colonnes de deux tableaux<\/strong> (<code>compare_df_cols()<\/code>) et d\u00e9terminent si, en l\u2019\u00e9tat ils peuvent \u00eatre \u201crecoll\u00e9s\u201d en semble par une op\u00e9ration de type <code>bind_rows()<\/code> ou <code>rbind()<\/code> (<code>compare_df_cols_same()<\/code>)<\/p>\n<\/li>\n<\/ul>\n<p>-les fonctions <code>round_xxx()<\/code> constituent des am\u00e9liorations de la fonction <code>round()<\/code> consistant \u00e0 <strong>arrondir de mani\u00e8re syst\u00e9matique<\/strong> vers le haut les valeurs (<code>round_half_up()<\/code>) ou \u00e0 arrondir \u00e0 une fraction pr\u00e8s (<code>round_to_fraction()<\/code>)<\/p>\n<ul>\n<li>les fonctions <code>...clean_names()<\/code> permettent de <strong>nettoyer des noms<\/strong> (<code>make_clean_names()<\/code>) et notamment les <strong>noms de colonnes des tableaux<\/strong> (<code>clean_names()<\/code>). C\u2019est, je pense, cette fonction <code>clean_names()<\/code> que j\u2019utilise le plus fr\u00e9quemment dans le package <code>janitor<\/code>. <small> Si vous aussi vous \u00eates amen\u00e9s \u00e0 travailler avec des tableaux dont les noms de colonnes sont \u00e0 coucher dehors, vous comprendrez pourquoi\u2026<\/small> Admirez plut\u00f4t:<\/li>\n<\/ul>\n<p><!-- --><\/p>\n<pre><code>tib=tibble(\"Temp\u00e9rDegCelsius\"=NA,\n       \"pr\u00e9cipit (mm\/24h)\"=NA,\n       \"succ\u00e8s_prob(%)\"=NA,\n       \"Fiabilit\u00e9.Estim\"=NA) \ntib\n\n## # A tibble: 1 x 4\n##   Temp\u00e9rDegCelsius `pr\u00e9cipit (mm\/24h)` `succ\u00e8s_prob(%)` Fiabilit\u00e9.Estim\n##   &lt;lgl&gt;            &lt;lgl&gt;               &lt;lgl&gt;            &lt;lgl&gt;          \n## 1 NA               NA                  NA               NA\n\ntib %&gt;% clean_names()\n\n## # A tibble: 1 x 4\n##   temper_deg_celsius precipit_mm_24h succes_prob_percent fiabilite_estim\n##   &lt;lgl&gt;              &lt;lgl&gt;           &lt;lgl&gt;               &lt;lgl&gt;          \n## 1 NA                 NA              NA                  NA\n<\/code><\/pre>\n<p>A partir de noms de colonnes tr\u00e8s h\u00e9t\u00e9rog\u00e8nes et comprenant un certain nombre de caract\u00e8res sp\u00e9ciaux, la fonction <code>clean_names()<\/code> produit des noms homog\u00e8nes et commodes \u00e0 utiliser dans R. Par d\u00e9faut, la casse est de type \u201cserpent\u201d (<code>case=\"snake\"<\/code>): tous les mots sont \u00e9crits en minuscule, s\u00e9par\u00e9s par un underscore <code>_<\/code>. Alternativement, et si telle est votre habitude, vous pouvez demander \u00e0 ce que vos noms de variables soient en casse \u201cpetit chameau\u201d, \u201cgrand chameau\u201d ou \u201cserpent criard\u201d, etc., etc. (j\u2019adore ces d\u00e9nominations :-)\u2026).<\/p>\n<pre><code>tib %&gt;% clean_names(case=\"small_camel\")\n\n## # A tibble: 1 x 4\n##   temperDegCelsius precipitMm24H succesProbPercent fiabiliteEstim\n##   &lt;lgl&gt;            &lt;lgl&gt;         &lt;lgl&gt;             &lt;lgl&gt;         \n## 1 NA               NA            NA                NA\n\ntib %&gt;% clean_names(case=\"big_camel\")\n\n## # A tibble: 1 x 4\n##   TemperDegCelsius PrecipitMm24H SuccesProbPercent FiabiliteEstim\n##   &lt;lgl&gt;            &lt;lgl&gt;         &lt;lgl&gt;             &lt;lgl&gt;         \n## 1 NA               NA            NA                NA\n\ntib %&gt;% clean_names(case=\"screaming_snake\")\n\n## # A tibble: 1 x 4\n##   TEMPER_DEG_CELSIUS PRECIPIT_MM_24H SUCCES_PROB_PERCENT FIABILITE_ESTIM\n##   &lt;lgl&gt;              &lt;lgl&gt;           &lt;lgl&gt;               &lt;lgl&gt;          \n## 1 NA                 NA              NA                  NA\n<\/code><\/pre>\n<h2>Citation<\/h2>\n<p>Merci de citer ce billet de la mani\u00e8re suivante:<\/p>\n<pre><code>## Vaudor L (2020). \"Janitor: nettoie-moi cette table (et qu'elle brille!).\" _R-atique: Analyse de donn\u00e9es avec R_. &lt;URL: http:\/\/perso.ens-lyon.fr\/lise.vaudor\/janitor-nettoie-moi-cette-table-et-que-ca-brille\/&gt;.\n\n## @Misc{vaudor_janitor,\n##   author = {Lise Vaudor},\n##   title = {Janitor: nettoie-moi cette table (et qu'elle brille!)},\n##   month = {jun},\n##   year = {2020},\n##   journal = {R-atique: Analyse de donn\u00c3\u00a9es avec R},\n##   type = {blog},\n##   url = {http:\/\/perso.ens-lyon.fr\/lise.vaudor\/janitor-nettoie-moi-cette-table-et-que-ca-brille\/},\n## }\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Chers lecteurs, bonjour! Aujourd\u2019hui, je vais vous parler du package janitor, un package qui comprend notamment (mais pas seulement) un certain nombre de fonctions pour am\u00e9liorer vos tableaux de contingence. En Anglais, \u201cjanitor\u201d veut dire (plus ou moins) \u201chomme \u00e0 tout faire\u201d. Et en effet, outre les t\u00e2ches li\u00e9es \u00e0 la mise en forme de ces tableaux, le package janitor vise \u00e0 prendre en charge pour vous un certain nombre.. <a href=\"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/janitor-nettoie-moi-cette-table-et-que-ca-brille\/\">Read More<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-1234","post","type-post","status-publish","format-standard","hentry","category-tous-les-posts"],"_links":{"self":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/1234","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/comments?post=1234"}],"version-history":[{"count":10,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/1234\/revisions"}],"predecessor-version":[{"id":1277,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/1234\/revisions\/1277"}],"wp:attachment":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/media?parent=1234"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/categories?post=1234"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/tags?post=1234"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}