{"id":664,"date":"2017-03-09T15:34:35","date_gmt":"2017-03-09T14:34:35","guid":{"rendered":"http:\/\/perso.ens-lyon.fr\/lise.vaudor\/?p=664"},"modified":"2017-05-23T15:40:29","modified_gmt":"2017-05-23T13:40:29","slug":"dplyr","status":"publish","type":"post","link":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/dplyr\/","title":{"rendered":"dplyr: package magique pour manipuler ses tableaux de donn\u00e9es"},"content":{"rendered":"<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/dplyr\/Lise_Vaudor_headband-1.png\" alt=\"\" \/><\/p>\n<p>Ah, la joie de vous parler d&rsquo;un package qui va me\/vous simplifier la vie!&#8230; Aujourd&rsquo;hui, il s&rsquo;agit de <code>dplyr<\/code>, qui fait partie de la suite de packages <a href=\"https:\/\/blog.rstudio.org\/2016\/09\/15\/tidyverse-1-0-0\/\">tidyverse<\/a> (qui comprend <code>ggplot2<\/code>, <code>tidyr<\/code>, <code>stringr<\/code>, <code>lubridate<\/code> et tellement d&rsquo;autres) qui fait grand bruit en ce moment dans l&rsquo;univ-R.<\/p>\n<p><code>dplyr<\/code> vise \u00e0 simplifier la manipulation de tables de donn\u00e9es \u00e0 travers l&rsquo;usage de cinq \u00ab\u00a0verbes\u00a0\u00bb (ou fonctions):<\/p>\n<ul>\n<li><code>select<\/code>, qui permet de <strong>s\u00e9lectionner des variables<\/strong> (colonnes) du tableau de donn\u00e9es<\/li>\n<li><code>filter<\/code>, qui permet de <strong>filtrer les individus<\/strong> (lignes) du tableau de donn\u00e9es<\/li>\n<li><code>arrange<\/code>, qui permet de <strong>r\u00e9arranger le tableau de donn\u00e9es selon l&rsquo;ordre d&rsquo;une ou plusieurs variables<\/strong><\/li>\n<li><code>mutate<\/code>, qui permet de <strong>cr\u00e9er et ajouter de nouvelles variables<\/strong> (colonnes) au jeu de donn\u00e9es<\/li>\n<li><code>summarise<\/code> qui permet de <strong>r\u00e9sumer plusieurs valeurs en une seule<\/strong><\/li>\n<\/ul>\n<h1><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/dplyr\/dplyr_schema.png\" alt=\"\" \/><\/h1>\n<p>S&rsquo;il est clair qu&rsquo;il y avait d\u00e9j\u00e0 moyen de r\u00e9aliser toutes ces op\u00e9rations AVANT l&rsquo;existence du package <code>dplyr<\/code>, il n&rsquo;en demeure pas moins que ce package r\u00e9volutionne la manipulation de donn\u00e9es sous R en offrant des fonctions compl\u00e8tement intuitives et hyper pratiques pour r\u00e9aliser des op\u00e9rations qui pouvaient auparavant se r\u00e9v\u00e9ler quelque peu r\u00e9barbatives&#8230;<\/p>\n<p>Testons ces fonctions sur le jeu de donn\u00e9es (fictif) suivant <a href=\"..\/..\/lise.vaudor\/Rdata\/Graphiques_avec_ggplot2\/catdata.csv\">data_exemple.csv<\/a>. Bien s\u00fbr, ce jeu de donn\u00e9es traite de chats (de toutes les formes et de toutes les couleurs) car c&rsquo;est le sujet le plus int\u00e9ressant et le plus porteur qui soit.<\/p>\n<pre><code>catdata &lt;- read.table(\"..\/..\/lise.vaudor\/Rdata\/Graphiques_avec_ggplot2\/catdata.csv\", sep=\";\", header=T)\nprint(dim(catdata))\n\n## [1] 153   6\n\nprint(head(catdata))\n\n##   haircolor hairpattern    sex weight age foodtype\n## 1       red       solid female    4.6  12    other\n## 2     black       tabby female    5.5   6      dry\n## 3     white       tabby female    5.6   8      wet\n## 4       red       tabby female    6.1   5      dry\n## 5     brown       solid female    5.3   7      dry\n## 6     black       tabby   male    6.9   5      wet\n<\/code><\/pre>\n<p>Chargons le package <code>dplyr<\/code>:<\/p>\n<pre><code>require(dplyr)\n<\/code><\/pre>\n<h1>select<\/h1>\n<h1><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/dplyr\/dplyr_select.png\" alt=\"\" \/><\/h1>\n<p>Pour <strong>s\u00e9lectionner certaines variables<\/strong> (colonnes) du jeu de donn\u00e9es, rien de plus simple: on utilise la fonction <code>select<\/code> avec pour premier argument la table de donn\u00e9es et arguments suppl\u00e9mentaires les variables que l&rsquo;on souhaite s\u00e9lectionner:<\/p>\n<pre><code>data=select(catdata, weight, foodtype, age)\n\nprint(head(data))\n\n##   weight foodtype age\n## 1    4.6    other  12\n## 2    5.5      dry   6\n## 3    5.6      wet   8\n## 4    6.1      dry   5\n## 5    5.3      dry   7\n## 6    6.9      wet   5\n<\/code><\/pre>\n<p>Il est aussi possible d&rsquo;indiquer quelles variables on souhaite \u00e9carter:<\/p>\n<pre><code>data=select(catdata, - foodtype, -sex)\n\nprint(head(data))\n\n##   haircolor hairpattern weight age\n## 1       red       solid    4.6  12\n## 2     black       tabby    5.5   6\n## 3     white       tabby    5.6   8\n## 4       red       tabby    6.1   5\n## 5     brown       solid    5.3   7\n## 6     black       tabby    6.9   5\n<\/code><\/pre>\n<p>ou encore d&rsquo;indiquer une <strong>plage<\/strong> de colonnes (soit par les noms de variables, soit par les numeros de colonne, par exemple ci-apr\u00e8s on pourrait indiquer 1:4 au lieu de haircolor:weight)<\/p>\n<pre><code>data=select(catdata, haircolor:weight)\n\nprint(head(data))\n\n##   haircolor hairpattern    sex weight\n## 1       red       solid female    4.6\n## 2     black       tabby female    5.5\n## 3     white       tabby female    5.6\n## 4       red       tabby female    6.1\n## 5     brown       solid female    5.3\n## 6     black       tabby   male    6.9\n<\/code><\/pre>\n<p>On peut \u00e9galement (lorsque certains noms de variables sont g\u00e9n\u00e9riques, par exemple \u00ab\u00a0variable1&Prime;,\u00a0\u00bbvariable2&Prime;,\u00a0\u00bbvariable3&Prime;,\u00a0\u00bbtemperature_1930\u00a0\u00bb,\u00a0\u00bbtemperature_1950, etc.) s\u00e9lectionner l&rsquo;ensemble des variables qui nous int\u00e9ressent par des <strong>fonctions auxiliaires<\/strong>:<\/p>\n<ul>\n<li><code>starts_with<\/code> pour trouver les variables qui <strong>commencent<\/strong> par une certaine cha\u00eene de caract\u00e8res<\/li>\n<li><code>ends_with<\/code> pour trouver les variables qui <strong>terminent<\/strong> par une certaine cha\u00eene de caract\u00e8res<\/li>\n<li><code>contains<\/code> pour trouver les variables qui <strong>contiennent<\/strong> par une certaine cha\u00eene de caract\u00e8res<\/li>\n<li><code>matches<\/code> pour trouver les variables qui correspondent \u00e0 une <strong>expression r\u00e9guli\u00e8re<\/strong><\/li>\n<li><code>num_range<\/code> pour trouver des <strong>variables num\u00e9rot\u00e9es<\/strong>, dans une certaine gamme de valeurs<\/li>\n<li><code>one_of<\/code> pour passer un <strong>vecteur de noms<\/strong> de variables<\/li>\n<\/ul>\n<p>Je ne rentrerai pas dans le d\u00e9tail pour chacune d&rsquo;entre elles (pour plus de d\u00e9tails vous pouvez consulter <a href=\"https:\/\/www.r-bloggers.com\/the-complete-catalog-of-argument-variations-of-select-in-dplyr\/\">ce billet<\/a>) mais voici tout de m\u00eame un exemple avec <code>starts_with<\/code>:<\/p>\n<pre><code>data=select(catdata,starts_with(\"hair\"))\n\nprint(head(data))\n\n##   haircolor hairpattern\n## 1       red       solid\n## 2     black       tabby\n## 3     white       tabby\n## 4       red       tabby\n## 5     brown       solid\n## 6     black       tabby\n<\/code><\/pre>\n<h1>filter<\/h1>\n<h1><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/dplyr\/dplyr_filter.png\" alt=\"\" \/><\/h1>\n<p>Pour filtrer un tableau de donn\u00e9es en fonction des valeurs de telle ou telle variable, on utilise la fonction <code>filter<\/code>. Ici, on cherche toutes les lignes qui remplissent la condition <code>haircolor==\"red\"<\/code>:<\/p>\n<pre><code>data=filter(catdata,haircolor==\"red\")\n\nprint(dim(data));print(head(data))\n\n## [1] 29  6\n\n##   haircolor hairpattern    sex weight age foodtype\n## 1       red       solid female    4.6  12    other\n## 2       red       tabby female    6.1   5      dry\n## 3       red       solid female    2.3   3      dry\n## 4       red  colorpoint female    3.9   8      dry\n## 5       red       tabby female    4.6   7      dry\n## 6       red    tortoise female    5.9   8      wet\n<\/code><\/pre>\n<p>On peut <strong>combiner plusieurs conditions logiques<\/strong> (ET logique, par une virgule ou un &amp;, OU logique, par l&rsquo;op\u00e9rateur |).<\/p>\n<p>Pour les chats noirs qui p\u00e8sent plus de 7 kilos:<\/p>\n<pre><code>data=filter(catdata,haircolor==\"black\" , weight&gt;7)\n\nprint(data)\n\n##   haircolor hairpattern  sex weight age foodtype\n## 1     black      tipped male    7.5   4      dry\n## 2     black  colorpoint male    7.1   5      wet\n## 3     black       solid male    7.1   5      wet\n<\/code><\/pre>\n<p>Pour les chats particuli\u00e8rement gros (plus de 7 kilos) OU particuli\u00e8rement vieux (plus de 15 ans):<\/p>\n<pre><code>data=filter(catdata, weight&gt;7 | age&gt;15)\n\nprint(data)\n\n##   haircolor hairpattern    sex weight age foodtype\n## 1     black      tipped   male    7.5   4      dry\n## 2       red  colorpoint   male    5.9  17      wet\n## 3     black       tabby female    1.9  17      dry\n## 4     black  colorpoint   male    7.1   5      wet\n## 5     black       solid   male    7.1   5      wet\n## 6     black       solid female    6.2  17      dry\n<\/code><\/pre>\n<h1>arrange<\/h1>\n<h1><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/dplyr\/dplyr_arrange.png\" alt=\"\" \/><\/h1>\n<p>Pour r\u00e9arranger un tableau selon l&rsquo;ordre d&rsquo;une variable, on peut faire appel \u00e0 la fonction <code>arrange<\/code> (ici, par exemple on r\u00e9ordonne catdata selon l&rsquo;ordre croissant de <code>weight<\/code>):<\/p>\n<pre><code>data=arrange(catdata,weight)\n\nprint(head(data))\n\n##   haircolor hairpattern    sex weight age foodtype\n## 1     black       tabby female    1.9  17      dry\n## 2       red       solid female    2.3   3      dry\n## 3     white       solid   male    2.5   3      wet\n## 4     black       tabby female    2.6  10      dry\n## 5     black       solid female    2.8  11      dry\n## 6     brown      tipped female    2.9   8      dry\n<\/code><\/pre>\n<p>On peut \u00e9galement trier le tableau selon les niveaux d&rsquo;une facteur:<\/p>\n<pre><code>data=arrange(catdata,sex)\n\nprint(head(data))\n\n##   haircolor hairpattern    sex weight age foodtype\n## 1       red       solid female    4.6  12    other\n## 2     black       tabby female    5.5   6      dry\n## 3     white       tabby female    5.6   8      wet\n## 4       red       tabby female    6.1   5      dry\n## 5     brown       solid female    5.3   7      dry\n## 6     black  colorpoint female    5.5   4      wet\n<\/code><\/pre>\n<p>Il est en outre possible de choisir un deuxi\u00e8me (troisi\u00e8me, etc.) crit\u00e8re de tri:<\/p>\n<pre><code>data=arrange(catdata,sex,age)\n\nprint(head(data))\n\n##   haircolor hairpattern    sex weight age foodtype\n## 1       red       solid female    2.3   3      dry\n## 2     brown      tipped female    6.1   3      dry\n## 3       red       tabby female    4.6   3      dry\n## 4       red       tabby female    4.5   3      dry\n## 5     brown      tipped female    4.4   3      dry\n## 6     black      tipped female    6.7   3      dry\n<\/code><\/pre>\n<p>et pour ordonner par ordre d\u00e9croissant, on utilise <code>desc<\/code>:<\/p>\n<pre><code>data=arrange(catdata,sex,desc(age))\n\nprint(head(data))\n\n##   haircolor hairpattern    sex weight age foodtype\n## 1     black       tabby female    1.9  17      dry\n## 2     black       solid female    6.2  17      dry\n## 3       red    tortoise female    3.4  13      wet\n## 4       red       solid female    4.6  12    other\n## 5     black  colorpoint female    5.4  12    other\n## 6     black       solid female    2.8  11      dry\n<\/code><\/pre>\n<h1>mutate<\/h1>\n<h1><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/dplyr\/dplyr_mutate.png\" alt=\"\" \/><\/h1>\n<p>Pour cr\u00e9er de nouvelles variables et les ajouter au tableau de donn\u00e9es on peut utiliser la fonction <code>mutate<\/code>:<\/p>\n<p>Voici par exemple comment proc\u00e9der si je souhaite cr\u00e9er une nouvelle variable, \u00ab\u00a0hair\u00a0\u00bb, en combinant les variables <code>haircolor<\/code> et <code>hairpattern<\/code>:<\/p>\n<pre><code>data=mutate(catdata,hair=paste(haircolor,hairpattern,sep=\"_\"))\n\nprint(head(data))\n\n##   haircolor hairpattern    sex weight age foodtype        hair\n## 1       red       solid female    4.6  12    other   red_solid\n## 2     black       tabby female    5.5   6      dry black_tabby\n## 3     white       tabby female    5.6   8      wet white_tabby\n## 4       red       tabby female    6.1   5      dry   red_tabby\n## 5     brown       solid female    5.3   7      dry brown_solid\n## 6     black       tabby   male    6.9   5      wet black_tabby\n<\/code><\/pre>\n<p>ou si je souhaite conna\u00eetre \u00ab\u00a0l&rsquo;\u00e2ge \u00e9quivalent humain\u00a0\u00bb de mes chats:<\/p>\n<pre><code>data=mutate(catdata,age_humain=age*7)\n\nprint(head(data))\n\n##   haircolor hairpattern    sex weight age foodtype age_humain\n## 1       red       solid female    4.6  12    other         84\n## 2     black       tabby female    5.5   6      dry         42\n## 3     white       tabby female    5.6   8      wet         56\n## 4       red       tabby female    6.1   5      dry         35\n## 5     brown       solid female    5.3   7      dry         49\n## 6     black       tabby   male    6.9   5      wet         35\n<\/code><\/pre>\n<h1>summarise<\/h1>\n<h1><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/dplyr\/dplyr_summarise.png\" alt=\"\" \/><\/h1>\n<p>Last but not least, imaginons que je souhaite calculer quelques <strong>statistiques<\/strong> un peu basiques sur mon jeu de donn\u00e9es. Je peux pour ce faire utiliser la fonction <code>summarise<\/code>.<\/p>\n<p>Par exemple, pour calculer l&rsquo;\u00e2ge et le poids moyen de mes chats:<\/p>\n<pre><code>data=summarise(catdata,mean_weight=mean(weight), mean_age=mean(age))\n\nprint(data)\n\n##   mean_weight mean_age\n## 1    4.891503 6.124183\n<\/code><\/pre>\n<p>Et surtout, si je souhaite calculer une statistique pour <strong>diff\u00e9rents groupes<\/strong> (d\u00e9finis ici, par exemple, par la variable <code>sex<\/code>), je vais le sp\u00e9cifier dans l&rsquo;argument sp\u00e9cifiant la table de donn\u00e9es, \u00e0 l&rsquo;aide de la fonction <code>group_by<\/code>:<\/p>\n<pre><code>data=summarise(group_by(catdata,sex,haircolor),mean_weight=mean(weight), mean_age=mean(age))\n\nprint(data)\n\n## Source: local data frame [8 x 4]\n## Groups: sex [?]\n## \n##      sex haircolor mean_weight mean_age\n##   &lt;fctr&gt;    &lt;fctr&gt;       &lt;dbl&gt;    &lt;dbl&gt;\n## 1 female     black    4.634286 6.885714\n## 2 female     brown    4.833333 5.416667\n## 3 female       red    4.675000 6.450000\n## 4 female     white    4.900000 6.250000\n## 5   male     black    5.245455 5.681818\n## 6   male     brown    5.230000 6.000000\n## 7   male       red    4.822222 7.111111\n## 8   male     white    4.600000 5.200000\n<\/code><\/pre>\n<p>Il est en outre possible de travailler avec des groupements d\u00e9finis par plusieurs variables, et (\u00e9videmment) avec des fonctions autres que la moyenne!<\/p>\n<pre><code>data=summarise(group_by(catdata,sex,haircolor),\n               min_weight=min(weight),\n               max_weight=max(weight),\n               nbre_individus=n(),\n               nbre_hairpattern=n_distinct(hairpattern)\n               )\n\nprint(data)\n\n## Source: local data frame [8 x 6]\n## Groups: sex [?]\n## \n##      sex haircolor min_weight max_weight nbre_individus nbre_hairpattern\n##   &lt;fctr&gt;    &lt;fctr&gt;      &lt;dbl&gt;      &lt;dbl&gt;          &lt;int&gt;            &lt;int&gt;\n## 1 female     black        1.9        7.0             35                5\n## 2 female     brown        2.9        6.3             12                4\n## 3 female       red        2.3        6.6             20                5\n## 4 female     white        3.2        6.0              8                3\n## 5   male     black        3.5        7.5             44                5\n## 6   male     brown        4.2        6.3             10                4\n## 7   male       red        3.8        6.1              9                5\n## 8   male     white        2.5        6.4             15                5\n<\/code><\/pre>\n<p>Remarquez au passage l&rsquo;usage des <strong>fonctions auxiliaires <code>n()<\/code> et <code>n_distinct()<\/code><\/strong> qui permettent simplement de compter le nombre d&rsquo;individus dans chaque groupe ainsi que le nombre de niveaux distincts d&rsquo;une variable pour un groupe.<\/p>\n<h1>Chainage<\/h1>\n<p>Vous avez vu que les fonctions de <code>dplyr<\/code> permettaient de faire toutes sortes d&rsquo;op\u00e9rations sur les tableaux de donn\u00e9es. Il est bien entendu possible de les <strong>combiner<\/strong> pour r\u00e9aliser des op\u00e9rations complexes&#8230;<\/p>\n<p>Imaginons par exemple que l&rsquo;on souhaite r\u00e9pondre \u00e0 une question telle que \u00ab\u00a0Quel est le sexe et le poids du plus gros chat roux qui mange des croquettes?\u00a0\u00bb<\/p>\n<p>Pour r\u00e9pondre \u00e0 cette question, je pourrais par exemple (il y a en fait plusieurs possibilit\u00e9s):<\/p>\n<ul>\n<li>s\u00e9lectionner les variables qui m&rsquo;int\u00e9ressent, \u00e0 savoir, sex, haircolor, weight, et foodtype <em>puis<\/em><\/li>\n<li>filtrer les lignes pour n&rsquo;avoir que les chats roux qui mangent des croquettes <em>puis<\/em><\/li>\n<li>filtrer pour ne garder que le plus gros chat<\/li>\n<\/ul>\n<p>Classiquement, pour coder cette cha\u00eene d&rsquo;op\u00e9rations sous R, on proc\u00e9derait de la mani\u00e8re suivante:<\/p>\n<pre><code>data1=select(catdata, sex,haircolor,weight,foodtype)\ndata2=filter(data1, haircolor==\"red\",foodtype==\"dry\")\ndata3=filter(data2, weight==max(weight))\n\nprint(data3)\n\n##      sex haircolor weight foodtype\n## 1 female       red    6.6      dry\n<\/code><\/pre>\n<p>Ainsi, le plus gros chat roux mangeant des croquettes est <strong>une femelle<\/strong>. (Pour ceux qui, connaissant le petit <a href=\"..\/..\/lise.vaudor\/Rfigures\/dplyr\/PBvignette.png\">Bertrand<\/a> s&rsquo;\u00e9tonneraient de ce r\u00e9sultat je pr\u00e9cise \u00e0 nouveau qu&rsquo;il s&rsquo;agit d&rsquo;un jeu de donn\u00e9es fictif&#8230;)<\/p>\n<p>Si je souhaitais r\u00e9aliser cet encha\u00eenement de commandes en une seule op\u00e9ration, et ainsi \u00e9viter la cr\u00e9ation d&rsquo;objets interm\u00e9diaires data1, data2, etc., voici (classiquement) comment il faudrait proc\u00e9der:<\/p>\n<pre><code>filter(\n  filter(\n    select(\n      catdata, sex,haircolor,weight,foodtype\n    ),\n    haircolor==\"red\",foodtype==\"dry\"\n  ),\n  weight==max(weight)\n)\n\n##      sex haircolor weight foodtype\n## 1 female       red    6.6      dry\n<\/code><\/pre>\n<p>Il faut avouer que ce n&rsquo;est ni tr\u00e8s pratique \u00e0 \u00e9crire, ni tr\u00e8s facile \u00e0 relire, car il faut faire un petit effort mental pour retracer l&rsquo;ordre des op\u00e9rations (de l&rsquo;int\u00e9rieur vers l&rsquo;ext\u00e9rieur) l\u00e0 o\u00f9 en \u00ab\u00a0syntaxe humaine\u00a0\u00bb on envisageait plut\u00f4t le cha\u00eenage de ces op\u00e9rations de mani\u00e8re lin\u00e9aire (on fait <em>\u00e7a<\/em> puis <em>\u00e7a<\/em> puis <em>\u00e7a<\/em>).<\/p>\n<p>Eh bien, <code>dplyr<\/code> permet de se rapprocher de cette \u00ab\u00a0syntaxe humaine\u00a0\u00bb en permettant d&rsquo;utiliser un op\u00e9rateur (l&rsquo;op\u00e9rateur \u00ab\u00a0pipe\u00a0\u00bb) qui s&rsquo;\u00e9crit de la mani\u00e8re suivante : <code>%&gt;%<\/code> et que l&rsquo;on pourrait (en gros) traduire par \u00ab\u00a0puis\u00a0\u00bb&#8230;<\/p>\n<p>Voyez plut\u00f4t comment le code ci-dessus peut \u00eatre simplifi\u00e9 par l&rsquo;usage de cet op\u00e9rateur:<\/p>\n<pre><code>select(catdata, sex,haircolor,weight,foodtype) %&gt;%\n  filter(haircolor==\"red\",foodtype==\"dry\") %&gt;%\n  filter(weight==max(weight))\n\n##      sex haircolor weight foodtype\n## 1 female       red    6.6      dry\n<\/code><\/pre>\n<p>Les 3 lignes ci-dessus forment une seule commande, qui ex\u00e9cute exactement les m\u00eames op\u00e9rations que les 9 lignes de la commande pr\u00e9c\u00e9dente, mais de mani\u00e8re beaucoup plus concise et claire&#8230;<\/p>\n<p>Remarquez qu&rsquo;avec l&rsquo;usage du pipe, le premier argument -qui devrait \u00eatre une table- dispara\u00eet de l&rsquo;appel aux fonctions <code>filter<\/code> et <code>arrange<\/code>. En effet, le pipe envoie le r\u00e9sultat de la ligne pr\u00e9c\u00e9dente comme premier argument de la ligne suivante (i.e. le r\u00e9sultat de <code>select()<\/code> est envoy\u00e9 comme premier argument de <code>filter(..., haircolor==\"red\",foodtype==\"dry\")<\/code> puis le r\u00e9sultat de <code>filter(...,haircolor==\"red\",foodtype==\"dry\")<\/code>est envoy\u00e9 comme premier argument de <code>filter(..., weight==max(weight))<\/code>.<\/p>\n<p>Si au tout d\u00e9but la syntaxe que permet le pipe est un peu d\u00e9stabilisante (une fois qu&rsquo;on a appris la syntaxe de R \u00ab\u00a0classique\u00a0\u00bb) elle devient vite addictive tant elle permet de faire en deux coups de cuill\u00e8re \u00e0 pot des cha\u00eenes d&rsquo;op\u00e9rations complexes&#8230;<\/p>\n<p>Pour votre culture personnelle, sachez que cet op\u00e9rateur pipe <code>%&gt;%<\/code> qui pourrait bien devenir votre nouveau meilleur ami provient d&rsquo;un autre package R, <a href=\"https:\/\/cran.r-project.org\/web\/packages\/magrittr\/vignettes\/magrittr.html\">magrittR<\/a>, qui lui m\u00eame fait partie de la suite de packages <code>tidyverse<\/code> que j&rsquo;\u00e9voquais au tout d\u00e9but de ce billet&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ah, la joie de vous parler d&rsquo;un package qui va me\/vous simplifier la vie!&#8230; Aujourd&rsquo;hui, il s&rsquo;agit de dplyr, qui fait partie de la suite de packages tidyverse (qui comprend ggplot2, tidyr, stringr, lubridate et tellement d&rsquo;autres) qui fait grand bruit en ce moment dans l&rsquo;univ-R. dplyr vise \u00e0 simplifier la manipulation de tables de donn\u00e9es \u00e0 travers l&rsquo;usage de cinq \u00ab\u00a0verbes\u00a0\u00bb (ou fonctions): select, qui permet de s\u00e9lectionner des.. <a href=\"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/dplyr\/\">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-664","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\/664","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=664"}],"version-history":[{"count":14,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/664\/revisions"}],"predecessor-version":[{"id":679,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/664\/revisions\/679"}],"wp:attachment":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/media?parent=664"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/categories?post=664"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/tags?post=664"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}