{"id":76291,"date":"2020-04-01T13:42:28","date_gmt":"2020-04-01T11:42:28","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/r-paket-tidyr-i-ego-novye-funkczii-pivot_longer-i-pivot_wider"},"modified":"2020-04-01T13:42:28","modified_gmt":"2020-04-01T11:42:28","slug":"r-paket-tidyr-i-ego-novye-funkczii-pivot_longer-i-pivot_wider","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/r-paket-tidyr-i-ego-novye-funkczii-pivot_longer-i-pivot_wider","title":{"rendered":"Le paquet R tidyr et ses nouvelles fonctionnalit\u00e9s pivot_longer et pivot_wider","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Package <strong>tidyr<\/strong> fait partie du c\u0153ur de l'une des biblioth\u00e8ques les plus populaires du langage R \u2014 <strong>tidyverse<\/strong>.<br \/>\nLa principale fonction du package est de mettre les donn\u00e9es en forme soign\u00e9e.<\/p>\n<p><\/p>\n<p>Sur Habr, il existe d\u00e9j\u00e0 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/248741\/\">publication<\/a><\/noindex> consacr\u00e9e \u00e0 ce package, mais elle date de l'ann\u00e9e 2015. Et je veux parler des changements les plus r\u00e9cents, que son auteur Hadley Wickham a signal\u00e9s il y a quelques jours.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Le paquet R tidyr et ses nouvelles fonctionnalit\u00e9s pivot_longer et pivot_wider\" src=\"\/wp-content\/uploads\/2020\/04\/a290263b63aaea3db70e83a1ec411415.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<blockquote><p><b>SJK<\/b>: Les fonctions gather() et spread() seront-elles consid\u00e9r\u00e9es comme obsol\u00e8tes ?<\/p>\n<p><b>Hadley Wickham<\/b>: Dans une certaine mesure. Nous cesserons de recommander l'utilisation de ces fonctions et de corriger les erreurs qui y sont associ\u00e9es, mais elles resteront pr\u00e9sentes dans le package dans leur \u00e9tat actuel.<\/p><\/blockquote>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"soderzhanie\">Contenu<\/h2>\n<p><\/p>\n<p><em>Si vous vous int\u00e9ressez \u00e0 l'analyse de donn\u00e9es, mes <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/R4marketing\">telegram<\/a><\/noindex> et <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/R4marketing\/?sub_confirmation=1\">youtube<\/a><\/noindex> cha\u00eenes pourraient vous int\u00e9resser. La majorit\u00e9 du contenu est consacr\u00e9 au langage R.<\/em><\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"#koncepciya-tidydata\">Le concept de TidyData<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#osnovnye-funkcii-vhodyaschie-v-paket-tydir\">Les principales fonctions incluses dans le package tidyr<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#novaya-koncepciya-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy-i-naoborot\">Un nouveau concept de transformation des donn\u00e9es d'un format large \u00e0 long et vice versa<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/ustnovka-naibolee-aktualnoy-versii-tidyr-0839000\">Installation de la version la plus r\u00e9cente de tidyr 0.8.3.9000<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#perehod-na-novye-funkcii\">Passage aux nouvelles fonctions<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#prostoy-primer-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy\">Un exemple simple de transformation des donn\u00e9es d'un format large \u00e0 un format long<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#specifikacii\">Sp\u00e9cifications<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#specifikaciya-s-ispolzovaniem-neskolkih-znacheniyvalue\">Sp\u00e9cification utilisant plusieurs valeurs (.value)<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#preobrazovanie-data-freymov-iz-dlinnogo-formata-k-shirokomu\">Transformation des data frames d'un format long \u00e0 large<\/a><\/noindex>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"#prosteyshiy-primer-privedeniya-tablicy-k-shirokomu-formatu\">Un exemple basique de mise en forme d'une table au format large<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#generaciya-imeni-stolbca-iz-neskolkih-ishodnyh-peremennyh\">G\u00e9n\u00e9ration du nom de colonne \u00e0 partir de plusieurs variables d'origine<\/a><\/noindex><\/li>\n<\/ul>\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#neskolko-prodvinutyh-primerov-raboty-s-novoy-koncepciey-tidyr\">Quelques exemples avanc\u00e9s de travail avec le nouveau concept de tidyr<\/a><\/noindex>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"#privedenie-dannyh-k-akkuratnomu-vidu-na-primere-nabora-dannyh-o-perepisi-dohoda-i-arendnoy-platy-v-ssha\">Mettre les donn\u00e9es en forme soign\u00e9e \u00e0 l'aide d'un ensemble de donn\u00e9es sur les revenus et les loyers aux \u00c9tats-Unis<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#vsemirnyy-bank\">Banque mondiale<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#spisok-kontaktov\">Liste des contacts<\/a><\/noindex><\/li>\n<\/ul>\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#zaklyuchenie\">Conclusion<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"koncepciya-tidydata\">Le concept de TidyData<\/h2>\n<p><\/p>\n<p>L'objectif <strong>tidyr<\/strong> \u2014 vous aider \u00e0 mettre vos donn\u00e9es en forme dite soign\u00e9e. Des donn\u00e9es soign\u00e9es, c'est des donn\u00e9es o\u00f9 : <\/p>\n<p><\/p>\n<ul>\n<li>Chaque variable se trouve dans une colonne. <\/li>\n<li>Chaque observation est une ligne. <\/li>\n<li>Chaque valeur repr\u00e9sente une cellule.<\/li>\n<\/ul>\n<p><\/p>\n<p>Travailler avec des donn\u00e9es mises au format tidy est beaucoup plus simple et pratique lors de l'analyse.<\/p>\n<p><\/p>\n<h2 id=\"osnovnye-funkcii-vhodyaschie-v-paket-tidyr\">Les principales fonctions incluses dans le package tidyr<\/h2>\n<p><\/p>\n<p>tidyr contient un ensemble de fonctions con\u00e7ues pour transformer les tables :<\/p>\n<p><\/p>\n<ul>\n<li><code>fill()<\/code> \u2014 remplit les valeurs manquantes d'une colonne avec les valeurs pr\u00e9c\u00e9dentes ;<\/li>\n<li><code>separate()<\/code> \u2014 divise un champ en plusieurs \u00e0 l'aide d'un s\u00e9parateur ;<\/li>\n<li><code>unite()<\/code> \u2014 r\u00e9alise l'op\u00e9ration de combinaison de plusieurs champs en un, l'action inverse de la fonction <code>separate()<\/code>;<\/li>\n<li><code>pivot_longer()<\/code> \u2014 fonction qui transforme des donn\u00e9es d'un format large \u00e0 long ;<\/li>\n<li><code>pivot_wider()<\/code> \u2014 fonction qui transforme des donn\u00e9es d'un format long \u00e0 large. L'op\u00e9ration est l'inverse de celle r\u00e9alis\u00e9e par la fonction <code>pivot_longer()<\/code>.<\/li>\n<li><code>gather()<\/code><strong>obsol\u00e8te<\/strong> \u2014 fonction qui transforme des donn\u00e9es d'un format large \u00e0 long ;<\/li>\n<li><code>spread()<\/code><strong>obsol\u00e8te<\/strong> \u2014 fonction qui transforme des donn\u00e9es d'un format long \u00e0 large. L'op\u00e9ration est l'inverse de celle r\u00e9alis\u00e9e par la fonction <code>gather()<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"novaya-koncepciya-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy-i-naoborot\">Un nouveau concept de transformation des donn\u00e9es d'un format large \u00e0 long et vice versa<\/h2>\n<p><\/p>\n<p>Auparavant, des fonctions \u00e9taient utilis\u00e9es pour ce type de transformation <code>gather()<\/code> et <code>spread()<\/code>. Au fil des ans, il est devenu \u00e9vident que pour la plupart des utilisateurs, y compris l'auteur du package, les noms de ces fonctions et de leurs arguments n'\u00e9taient pas suffisamment clairs, ce qui compliquait leur recherche et la compr\u00e9hension de quelle fonction transforme un dataframe d'un format large en un format long, et vice versa.<\/p>\n<p><\/p>\n<p>C'est pourquoi <strong>tidyr<\/strong> deux nouvelles fonctions importantes ont \u00e9t\u00e9 ajout\u00e9es, destin\u00e9es \u00e0 transformer les dataframes.<\/p>\n<p><\/p>\n<p>Nouvelles fonctionnalit\u00e9s <code>pivot_longer()<\/code> et <code>pivot_wider()<\/code> ont \u00e9t\u00e9 con\u00e7ues sous l'influence de certaines fonctions du package <strong>cdata<\/strong>, cr\u00e9\u00e9 par John Mount et Nina Zumel.<\/p>\n<p><\/p>\n<h3 id=\"ustanovka-naibolee-aktualnoy-versii-tidyr-0839000\">Installation de la version la plus r\u00e9cente de tidyr 0.8.3.9000<\/h3>\n<p><\/p>\n<p>Pour installer la version la plus r\u00e9cente du package <strong>tidyr<\/strong> <em>0.8.3.9000<\/em>, qui contient les nouvelles fonctions, utilisez le code suivant.<\/p>\n<p><\/p>\n<p><code>devtools::install_github(\"tidyverse\/tidyr\")<\/code><\/p>\n<p><\/p>\n<p>Au moment de la r\u00e9daction de cet article, ces fonctions ne sont disponibles que dans la version dev du package sur GitHub.<\/p>\n<p><\/p>\n<h3 id=\"perehod-na-novye-funkcii\">Passage aux nouvelles fonctions<\/h3>\n<p><\/p>\n<p>Il n'est pas difficile de traduire les anciens scripts pour les adapter aux nouvelles fonctions. Pour une meilleure compr\u00e9hension, je vais prendre un exemple de la documentation des anciennes fonctions et montrer comment ces m\u00eames op\u00e9rations s'effectuent avec les nouvelles <code>pivot_*()<\/code> fonctions.<\/p>\n<p><\/p>\n<p>Transformation du format large au format long.<\/p>\n<p>\n<b class=\"spoiler_title\">Exemple de code extrait de la documentation de la fonction gather<\/b><\/p>\n<pre><code class=\"plaintext\"># example\nlibrary(dplyr)\nstocks &lt;- data.frame(\n  time = as.Date('2009-01-01') + 0:9,\n  X = rnorm(10, 0, 1),\n  Y = rnorm(10, 0, 2),\n  Z = rnorm(10, 0, 4)\n)\n\n# old\nstocks_gather &lt;- stocks %&gt;% gather(key   = stock, \n                                   value = price, \n                                   -time)\n\n# new\nstocks_long   &lt;- stocks %&gt;% pivot_longer(cols      = -time, \n                                       names_to  = &quot;stock&quot;, \n                                       values_to = &quot;price&quot;)\n<\/code><\/pre>\n<p><\/p>\n<p>Transformation du format long au format large.<\/p>\n<p>\n<b class=\"spoiler_title\">Exemple de code extrait de la documentation de la fonction spread<\/b><\/p>\n<pre><code class=\"plaintext\"># old\nstocks_spread &lt;- stocks_gather %&gt;% spread(key = stock, \n                                          value = price) \n\n# new \nstock_wide    &lt;- stocks_long %&gt;% pivot_wider(names_from  = &quot;stock&quot;,\n                                            values_from = &quot;price&quot;)\n<\/code><\/pre>\n<p><\/p>\n<p>\u00c9tant donn\u00e9 que dans les exemples ci-dessus traitant de <code>pivot_longer()<\/code> et <code>pivot_wider()<\/code>, dans le tableau source <em>stocks<\/em> il n'y a pas de colonnes \u00e9num\u00e9r\u00e9es dans les arguments <em>names_to<\/em> et <em>values_to<\/em> leurs noms doivent \u00eatre indiqu\u00e9s entre guillemets.<\/p>\n<p><\/p>\n<p>Tableau qui vous aidera le plus \u00e0 comprendre comment passer \u00e0 la nouvelle conception <strong>tidyr<\/strong>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le paquet R tidyr et ses nouvelles fonctionnalit\u00e9s pivot_longer et pivot_wider\" src=\"\/wp-content\/uploads\/2020\/04\/fe598b5cd152088a2f1b23b846d212e9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h2 id=\"primechanie-ot-avtora\">Note de l'auteur<\/h2>\n<p><\/p>\n<blockquote><p>Tout le texte pr\u00e9sent\u00e9 ci-dessous est une adaptation, je dirais m\u00eame une traduction libre <noindex><a rel=\"nofollow\" href=\"https:\/\/tidyr.tidyverse.org\/dev\/articles\/pivot.html\">vignettes<\/a><\/noindex> du site officiel de la biblioth\u00e8que tidyverse.<\/p><\/blockquote>\n<p><\/p>\n<h2 id=\"prostoy-primer-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy\">Un exemple simple de transformation des donn\u00e9es d'un format large \u00e0 un format long<\/h2>\n<p><\/p>\n<p><code>pivot_longer ()<\/code> rend les ensembles de donn\u00e9es plus longs, r\u00e9duisant le nombre de colonnes et augmentant le nombre de lignes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le paquet R tidyr et ses nouvelles fonctionnalit\u00e9s pivot_longer et pivot_wider\" src=\"\/wp-content\/uploads\/2020\/04\/fc88b99f2fecdcdaa6179d2e7d29e59d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pour ex\u00e9cuter les exemples pr\u00e9sent\u00e9s dans l'article, il est d'abord n\u00e9cessaire de charger les packages requis :<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">library(tidyr)\nlibrary(dplyr)\nlibrary(readr)<\/code><\/pre>\n<p><\/p>\n<p>Supposons que nous ayons un tableau avec les r\u00e9sultats d'un sondage, dans lequel (entre autres) les gens ont \u00e9t\u00e9 interrog\u00e9s sur leur religion et leur revenu annuel :<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 18 x 11\n#&gt;    religion `&lt;$10k` `$10-20k` `$20-30k` `$30-40k` `$40-50k` `$50-75k`\n#&gt;    &lt;chr&gt;      &lt;dbl&gt;     &lt;dbl&gt;     &lt;dbl&gt;     &lt;dbl&gt;     &lt;dbl&gt;     &lt;dbl&gt;\n#&gt;  1 Agnostic      27        34        60        81        76       137\n#&gt;  2 Atheist       12        27        37        52        35        70\n#&gt;  3 Buddhist      27        21        30        34        33        58\n#&gt;  4 Catholic     418       617       732       670       638      1116\n#&gt;  5 Don\u2019t k\u2026      15        14        15        11        10        35\n#&gt;  6 Evangel\u2026     575       869      1064       982       881      1486\n#&gt;  7 Hindu          1         9         7         9        11        34\n#&gt;  8 Histori\u2026     228       244       236       238       197       223\n#&gt;  9 Jehovah\u2026      20        27        24        24        21        30\n#&gt; 10 Jewish        19        19        25        25        30        95\n#&gt; # \u2026 with 8 more rows, and 4 more variables: `$75-100k` &lt;dbl&gt;,\n#&gt; #   `$100-150k` &lt;dbl&gt;, `&gt;150k` &lt;dbl&gt;, `Don't know\/refused` &lt;dbl&gt;<\/code><\/pre>\n<p><\/p>\n<p>Ce tableau contient des donn\u00e9es sur la religion des r\u00e9pondants dans les lignes, tandis que le niveau de revenu est dispers\u00e9 au-dessus des noms des colonnes. Le nombre de r\u00e9pondants dans chaque cat\u00e9gorie est stock\u00e9 dans les valeurs des cellules \u00e0 l'intersection de la religion et du niveau de revenu. Pour mettre le tableau dans un format soign\u00e9 et appropri\u00e9, il suffit d'utiliser <code>pivot_longer()<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">pew %&gt;% \n  pivot_longer(cols = -religion, names_to = \"income\", values_to = \"count\")<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">pew %&gt;% \n  pivot_longer(cols = -religion, names_to = \"income\", values_to = \"count\")\n#&gt; # A tibble: 180 x 3\n#&gt;    religion income             count\n#&gt;                      \n#&gt;  1 Agnostique   2 Agnostique 10-20k               34\n#&gt;  3 Agnostique 20-30k               60\n#&gt;  4 Agnostique 30-40k               81\n#&gt;  5 Agnostique 40-50k               76\n#&gt;  6 Agnostique 50-75k              137\n#&gt;  7 Agnostique 75-100k             122\n#&gt;  8 Agnostique 100-150k            109\n#&gt;  9 Agnostique &gt;150k                 84\n#&gt; 10 Agnostique Ne sais pas\/refus\u00e9    96\n#&gt; # \u2026 avec 170 autres lignes<\/code><\/pre>\n<p><\/p>\n<p>Arguments de la fonction <code>pivot_longer()<\/code><\/p>\n<p><\/p>\n<ul>\n<li>Premier argument <em>cols<\/em>, d\u00e9crit quelles colonnes doivent \u00eatre combin\u00e9es. Dans ce cas, toutes les colonnes sauf <em>time<\/em>.<\/li>\n<li>Argument <em>names_to<\/em> donne le nom de la variable qui sera cr\u00e9\u00e9e \u00e0 partir des noms des colonnes que nous avons combin\u00e9es.<\/li>\n<li><em>values_to<\/em> donne le nom de la variable qui sera cr\u00e9\u00e9e \u00e0 partir des donn\u00e9es stock\u00e9es dans les valeurs des cellules des colonnes combin\u00e9es.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"specifikacii\">Sp\u00e9cifications<\/h2>\n<p><\/p>\n<p>C'est une nouvelle fonctionnalit\u00e9 du package <strong>tidyr<\/strong>, qui \u00e9tait auparavant inaccessible lors de l'utilisation de fonctions obsol\u00e8tes.<\/p>\n<p><\/p>\n<p>La sp\u00e9cification est un cadre de donn\u00e9es, chaque ligne correspondant \u00e0 une colonne dans le nouveau cadre de donn\u00e9es de sortie, et deux colonnes sp\u00e9ciales qui commencent par : <\/p>\n<p><\/p>\n<ul>\n<li><em>.name<\/em> contient le nom d'origine de la colonne. <\/li>\n<li><em>.value<\/em> contient le nom de la colonne dans laquelle les valeurs des cellules entreront. <\/li>\n<\/ul>\n<p><\/p>\n<p>Les autres colonnes de la sp\u00e9cification refl\u00e8tent comment le nom des colonnes compress\u00e9es sera affich\u00e9 dans la nouvelle colonne de <em>.name<\/em>.<\/p>\n<p><\/p>\n<p>La sp\u00e9cification d\u00e9crit les m\u00e9tadonn\u00e9es stock\u00e9es dans le nom de la colonne, avec une ligne pour chaque colonne et une colonne pour chaque variable, combin\u00e9e avec le nom de la colonne, peut-\u00eatre que cette d\u00e9finition semble confuse maintenant, mais apr\u00e8s avoir regard\u00e9 quelques exemples, tout deviendra beaucoup plus clair.<\/p>\n<p><\/p>\n<p>Le sens de la sp\u00e9cification est que vous pouvez extraire, modifier et d\u00e9finir de nouvelles m\u00e9tadonn\u00e9es pour le cadre de donn\u00e9es transform\u00e9.<\/p>\n<p><\/p>\n<p>Pour travailler avec les sp\u00e9cifications lors de la transformation d'un tableau d'un format large vers un format long, utilisez la fonction <code>pivot_longer_spec()<\/code>.<\/p>\n<p><\/p>\n<p>Comment cette fonction fonctionne, elle prend n'importe quel cadre de donn\u00e9es et forme ses m\u00e9tadonn\u00e9es de la mani\u00e8re d\u00e9crite ci-dessus. <\/p>\n<p><\/p>\n<p>Prenons par exemple le jeu de donn\u00e9es who, fourni avec le package. <strong>tidyr<\/strong>Ce jeu de donn\u00e9es contient des informations fournies par l'organisation mondiale de la sant\u00e9 sur l'incidence de la tuberculose.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">who\n#&gt; # A tibble: 7,240 x 60\n#&gt;    country iso2  iso3   year new_sp_m014 new_sp_m1524 new_sp_m2534\n#&gt;        &lt;chr&gt; &lt;int&gt;       &lt;int&gt;        &lt;int&gt;        &lt;int&gt;\n#&gt;  1 Afghan\u2026 AF    AFG    1980          NA           NA           NA\n#&gt;  2 Afghan\u2026 AF    AFG    1981          NA           NA           NA\n#&gt;  3 Afghan\u2026 AF    AFG    1982          NA           NA           NA\n#&gt;  4 Afghan\u2026 AF    AFG    1983          NA           NA           NA\n#&gt;  5 Afghan\u2026 AF    AFG    1984          NA           NA           NA\n#&gt;  6 Afghan\u2026 AF    AFG    1985          NA           NA           NA\n#&gt;  7 Afghan\u2026 AF    AFG    1986          NA           NA           NA\n#&gt;  8 Afghan\u2026 AF    AFG    1987          NA           NA           NA\n#&gt;  9 Afghan\u2026 AF    AFG    1988          NA           NA           NA\n#&gt; 10 Afghan\u2026 AF    AFG    1989          NA           NA           NA\n#&gt; # \u2026 avec 7,230 autres lignes et 53 autres variables<\/code><\/pre>\n<p><\/p>\n<p>Construisons sa sp\u00e9cification.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec %\n  pivot_longer_spec(new_sp_m014:newrel_f65, values_to = \"count\")<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 56 x 3\n#&gt;    .name        .value name        \n#&gt;    &lt;chr&gt;        &lt;chr&gt;  &lt;chr&gt;       \n#&gt;  1 new_sp_m014  count  new_sp_m014 \n#&gt;  2 new_sp_m1524 count  new_sp_m1524\n#&gt;  3 new_sp_m2534 count  new_sp_m2534\n#&gt;  4 new_sp_m3544 count  new_sp_m3544\n#&gt;  5 new_sp_m4554 count  new_sp_m4554\n#&gt;  6 new_sp_m5564 count  new_sp_m5564\n#&gt;  7 new_sp_m65   count  new_sp_m65  \n#&gt;  8 new_sp_f014  count  new_sp_f014 \n#&gt;  9 new_sp_f1524 count  new_sp_f1524\n#&gt; 10 new_sp_f2534 count  new_sp_f2534\n#&gt; # \u2026 with 46 more rows<\/code><\/pre>\n<p><\/p>\n<p>Champs <em>pays<\/em>, <em>iso2<\/em>, <em>iso3<\/em> sont d\u00e9j\u00e0 des variables. Notre t\u00e2che est de retourner les colonnes avec <em>new_sp_m014<\/em> pour <em>newrel_f65<\/em>.<\/p>\n<p><\/p>\n<p>Les noms de ces colonnes contiennent les informations suivantes :<\/p>\n<p><\/p>\n<ul>\n<li>Pr\u00e9fixe <code>new_<\/code> indique que la colonne contient des donn\u00e9es sur de nouveaux cas de tuberculose, le dataframe actuel contient des informations uniquement sur de nouvelles maladies, donc ce pr\u00e9fixe n'a pas de signification dans ce contexte.<\/li>\n<li><code>sp<\/code>\/<code>rel<\/code>\/<code>sp<\/code>\/<code>ep<\/code> d\u00e9crit le mode de diagnostic de la maladie.<\/li>\n<li><code>m<\/code>\/<code>f<\/code> genre du patient.<\/li>\n<li><code>014<\/code>\/<code>1524<\/code>\/<code>2535<\/code>\/<code>3544<\/code>\/<code>4554<\/code>\/<code>65<\/code> tranche d'\u00e2ge du patient.<\/li>\n<\/ul>\n<p><\/p>\n<p>Nous pouvons s\u00e9parer ces colonnes \u00e0 l'aide de la fonction <code>extract()<\/code>, en utilisant des expressions r\u00e9guli\u00e8res.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec %\n        extract(name, c(\"diagnosis\", \"gender\", \"age\"), \"new_?(.*)_(.)(.*)\")<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 56 x 5\n#&gt;    .name        .value diagnosis gender age  \n#&gt;    &lt;chr&gt;        &lt;chr&gt;  &lt;chr&gt;     &lt;chr&gt;  &lt;chr&gt;\n#&gt;  1 new_sp_m014  count  sp        m      014  \n#&gt;  2 new_sp_m1524 count  sp        m      1524 \n#&gt;  3 new_sp_m2534 count  sp        m      2534 \n#&gt;  4 new_sp_m3544 count  sp        m      3544 \n#&gt;  5 new_sp_m4554 count  sp        m      4554 \n#&gt;  6 new_sp_m5564 count  sp        m      5564 \n#&gt;  7 new_sp_m65   count  sp        m      65   \n#&gt;  8 new_sp_f014  count  sp        f      014  \n#&gt;  9 new_sp_f1524 count  sp        f      1524 \n#&gt; 10 new_sp_f2534 count  sp        f      2534 \n#&gt; # \u2026 with 46 more rows<\/code><\/pre>\n<p><\/p>\n<p>Notez que la colonne <em>.name<\/em> doit rester inchang\u00e9e, car c'est notre index dans les noms de colonnes du jeu de donn\u00e9es d'origine. <\/p>\n<p><\/p>\n<p>Le genre et l'\u00e2ge (colonnes <em>gender<\/em> et <em>age<\/em>) ont des valeurs fixes et connues, il est donc recommand\u00e9 de convertir ces colonnes en facteurs :<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec %\n            mutate(\n              gender = factor(gender, levels = c(\"f\", \"m\")),\n              age = factor(age, levels = unique(age), ordered = TRUE)\n            ) <\/code><\/pre>\n<p><\/p>\n<p>Enfin, afin d'appliquer la sp\u00e9cification que nous avons cr\u00e9\u00e9e au dataframe d'origine <em>who<\/em> nous devons utiliser l\u2019argument <em>spec<\/em> dans la fonction <code>pivot_longer()<\/code>.<\/p>\n<p><\/p>\n<p><code>who %&gt;% pivot_longer(spec = spec)<\/code><\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 405,440 x 8\n#&gt;    country     iso2  iso3   year diagnosis gender age   count\n#&gt;    &lt;chr&gt;       &lt;chr&gt; &lt;chr&gt; &lt;int&gt; &lt;chr&gt;     &lt;fct&gt;  &lt;ord&gt; &lt;int&gt;\n#&gt;  1 Afghanistan AF    AFG    1980 sp        m      014      NA\n#&gt;  2 Afghanistan AF    AFG    1980 sp        m      1524     NA\n#&gt;  3 Afghanistan AF    AFG    1980 sp        m      2534     NA\n#&gt;  4 Afghanistan AF    AFG    1980 sp        m      3544     NA\n#&gt;  5 Afghanistan AF    AFG    1980 sp        m      4554     NA\n#&gt;  6 Afghanistan AF    AFG    1980 sp        m      5564     NA\n#&gt;  7 Afghanistan AF    AFG    1980 sp        m      65       NA\n#&gt;  8 Afghanistan AF    AFG    1980 sp        f      014      NA\n#&gt;  9 Afghanistan AF    AFG    1980 sp        f      1524     NA\n#&gt; 10 Afghanistan AF    AFG    1980 sp        f      2534     NA\n#&gt; # \u2026 with 405,430 more rows<\/code><\/pre>\n<p><\/p>\n<p>Tout ce que nous venons de faire peut \u00eatre sch\u00e9matiquement repr\u00e9sent\u00e9 comme suit :<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le paquet R tidyr et ses nouvelles fonctionnalit\u00e9s pivot_longer et pivot_wider\" src=\"\/wp-content\/uploads\/2020\/04\/77c8c266c205e1b087738d31de8b8523.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h2 id=\"specifikaciya-s-ispolzovaniem-neskolkih-znacheniyvalue\">Sp\u00e9cification utilisant plusieurs valeurs (.value)<\/h2>\n<p><\/p>\n<p>Dans l'exemple ci-dessus, la colonne de sp\u00e9cification <em>.value<\/em> ne contenait qu'une seule valeur, c'est le cas dans la plupart des cas. <\/p>\n<p><\/p>\n<p>Mais il peut parfois y avoir des situations o\u00f9 vous devez rassembler des donn\u00e9es de colonnes avec diff\u00e9rents types de donn\u00e9es. Avec la fonction obsol\u00e8te, <code>spread()<\/code> cela serait assez compliqu\u00e9 \u00e0 faire.<\/p>\n<p><\/p>\n<p>L'exemple ci-dessous est tir\u00e9 de <noindex><a rel=\"nofollow\" href=\"https:\/\/cran.r-project.org\/web\/packages\/data.table\/vignettes\/datatable-reshape.html\">vignettes<\/a><\/noindex> du package <strong>data.table<\/strong>.<\/p>\n<p><\/p>\n<p>Cr\u00e9ons un tableau de donn\u00e9es d'entra\u00eenement.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">family &lt;- tibble::tribble(\n  ~family,  ~dob_child1,  ~dob_child2, ~gender_child1, ~gender_child2,\n       1L, &quot;1998-11-26&quot;, &quot;2000-01-29&quot;,             1L,             2L,\n       2L, &quot;1996-06-22&quot;,           NA,             2L,             NA,\n       3L, &quot;2002-07-11&quot;, &quot;2004-04-05&quot;,             2L,             2L,\n       4L, &quot;2004-10-10&quot;, &quot;2009-08-27&quot;,             1L,             1L,\n       5L, &quot;2000-12-05&quot;, &quot;2005-02-28&quot;,             2L,             1L,\n)\nfamily % mutate_at(vars(starts_with(\"dob\")), parse_date)<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 5 x 5\n#&gt;   family dob_child1 dob_child2 gender_child1 gender_child2\n#&gt;    &lt;int&gt; &lt;date&gt;     &lt;date&gt;             &lt;int&gt;         &lt;int&gt;\n#&gt; 1      1 1998-11-26 2000-01-29             1             2\n#&gt; 2      2 1996-06-22 NA                     2            NA\n#&gt; 3      3 2002-07-11 2004-04-05             2             2\n#&gt; 4      4 2004-10-10 2009-08-27             1             1\n#&gt; 5      5 2000-12-05 2005-02-28             2             1<\/code><\/pre>\n<p><\/p>\n<p>Le tableau de donn\u00e9es cr\u00e9\u00e9 contient des donn\u00e9es sur les enfants d'une m\u00eame famille pour chaque ligne. Les familles peuvent avoir un ou deux enfants. Pour chaque enfant, des informations sur la date de naissance et le sexe sont fournies, avec les donn\u00e9es de chaque enfant dans des colonnes distinctes. Notre t\u00e2che est de formater ces donn\u00e9es correctement pour l'analyse.<\/p>\n<p><\/p>\n<p>Notez que nous avons deux variables contenant des informations sur chaque enfant : son sexe et sa date de naissance (colonnes avec le pr\u00e9fixe <em>dob<\/em> contiennent la date de naissance, les colonnes avec le pr\u00e9fixe <em>gender<\/em> contiennent le sexe de l'enfant). Dans le r\u00e9sultat attendu, elles doivent se trouver dans des colonnes s\u00e9par\u00e9es. Nous pouvons le faire en g\u00e9n\u00e9rant une sp\u00e9cification dans laquelle la colonne <code>.value<\/code> aura deux valeurs diff\u00e9rentes.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec %\n  pivot_longer_spec(-family) %&gt;%\n  separate(col = name, into = c(\".value\", \"child\")) %&gt;%\n  mutate(child = parse_number(child))\n<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 4 x 3\n#&gt;   .name         .value child\n#&gt;   &lt;chr&gt;         &lt;chr&gt;  &lt;dbl&gt;\n#&gt; 1 dob_child1    dob        1\n#&gt; 2 dob_child2    dob        2\n#&gt; 3 gender_child1 gender     1\n#&gt; 4 gender_child2 gender     2<\/code><\/pre>\n<p><\/p>\n<p>Alors, examinons \u00e9tape par \u00e9tape les actions effectu\u00e9es par le code ci-dessus.<\/p>\n<p><\/p>\n<ul>\n<li><code>pivot_longer_spec(-family)<\/code> \u2014 nous cr\u00e9ons une sp\u00e9cification qui condense toutes les colonnes disponibles, \u00e0 l'exception de la colonne family.<\/li>\n<li><code>separate(col = name, into = c(\".value\", \"child\"))<\/code> \u2014 nous s\u00e9parons la colonne <em>.name<\/em>, qui contient les noms des champs d'origine, par un trait de soulignement et nous pla\u00e7ons les valeurs obtenues dans les colonnes <em>.value<\/em> et <em>enfant<\/em>.<\/li>\n<li><code>mutate(child = parse_number(child))<\/code> \u2014 nous convertissons les valeurs du champ <em>enfant<\/em> du type texte en type num\u00e9rique.<\/li>\n<\/ul>\n<p><\/p>\n<p>Nous pouvons maintenant appliquer la sp\u00e9cification obtenue \u00e0 notre tableau de donn\u00e9es d'origine et amener la table \u00e0 l'apparence souhait\u00e9e.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">family %&gt;% \n    pivot_longer(spec = spec, na.rm = T)<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 9 x 4\n#&gt;   family child dob        gender\n#&gt;    &lt;int&gt; &lt;dbl&gt; &lt;date&gt;      &lt;int&gt;\n#&gt; 1      1     1 1998-11-26      1\n#&gt; 2      1     2 2000-01-29      2\n#&gt; 3      2     1 1996-06-22      2\n#&gt; 4      3     1 2002-07-11      2\n#&gt; 5      3     2 2004-04-05      2\n#&gt; 6      4     1 2004-10-10      1\n#&gt; 7      4     2 2009-08-27      1\n#&gt; 8      5     1 2000-12-05      2\n#&gt; 9      5     2 2005-02-28      1<\/code><\/pre>\n<p><\/p>\n<p>Nous utilisons l'argument <code>na.rm = TRUE<\/code>, car la forme actuelle des donn\u00e9es oblige \u00e0 cr\u00e9er des lignes suppl\u00e9mentaires pour les observations inexistantes. \u00c9tant donn\u00e9 que la famille 2 n'a qu'un seul enfant, <code>na.rm = TRUE<\/code> garantit que la famille 2 aura une ligne dans les donn\u00e9es de sortie.<\/p>\n<p><\/p>\n<h2 id=\"preobrazovanie-data-freymov-iz-dlinnogo-formata-k-shirokomu\">Transformation des data frames d'un format long \u00e0 large<\/h2>\n<p><\/p>\n<p><code>pivot_wider()<\/code> \u2014 est une transformation inverse, qui augmente en revanche le nombre de colonnes du cadre de donn\u00e9es tout en diminuant le nombre de lignes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le paquet R tidyr et ses nouvelles fonctionnalit\u00e9s pivot_longer et pivot_wider\" src=\"\/wp-content\/uploads\/2020\/04\/b470664e06f362d6f0ea6df9c1ed426d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ce type de transformation est extr\u00eamement rare pour mettre les donn\u00e9es en forme soign\u00e9e, cependant cette technique peut \u00eatre utile pour cr\u00e9er des tableaux crois\u00e9s utilis\u00e9s dans des pr\u00e9sentations, ou pour l'int\u00e9gration avec d'autres outils.<\/p>\n<p><\/p>\n<p>En fait, les fonctions <code>pivot_longer()<\/code> et <code>pivot_wider()<\/code> sont sym\u00e9triques, et produisent des actions r\u00e9ciproques, c'est-\u00e0-dire : <code>df %&gt;% pivot_longer(spec = spec) %&gt;% pivot_wider(spec = spec)<\/code> et <code>df %&gt;% pivot_wider(spec = spec) %&gt;% pivot_longer(spec = spec)<\/code> retournera le df d'origine.<\/p>\n<p><\/p>\n<h3 id=\"prosteyshiy-primer-privedeniya-tablicy-k-shirokomu-formatu\">Un exemple basique de mise en forme d'une table au format large<\/h3>\n<p><\/p>\n<p>Pour d\u00e9montrer le fonctionnement de la fonction <code>pivot_wider()<\/code> nous utiliserons le jeu de donn\u00e9es <em>fish_encounters<\/em>, qui contient des informations sur la fa\u00e7on dont diff\u00e9rentes stations enregistrent le d\u00e9placement des poissons dans la rivi\u00e8re.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 114 x 3\n#&gt;    fish  station  seen\n#&gt;    &lt;fct&gt; &lt;fct&gt;   &lt;int&gt;\n#&gt;  1 4842  Release     1\n#&gt;  2 4842  I80_1       1\n#&gt;  3 4842  Lisbon      1\n#&gt;  4 4842  Rstr        1\n#&gt;  5 4842  Base_TD     1\n#&gt;  6 4842  BCE         1\n#&gt;  7 4842  BCW         1\n#&gt;  8 4842  BCE2        1\n#&gt;  9 4842  BCW2        1\n#&gt; 10 4842  MAE         1\n#&gt; # \u2026 with 104 more rows<\/code><\/pre>\n<p><\/p>\n<p>Dans la plupart des cas, ce tableau sera plus informatif et pratique \u00e0 utiliser si les informations de chaque station sont pr\u00e9sent\u00e9es dans une colonne distincte.<\/p>\n<p><\/p>\n<p><code>fish_encounters %&gt;% pivot_wider(names_from = station, values_from = seen)<\/code><\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">fish_encounters %&gt;% pivot_wider(names_from = station, values_from = seen)\n#&gt; # A tibble: 19 x 12\n#&gt;    fish  Release I80_1 Lisbon  Rstr Base_TD   BCE   BCW  BCE2  BCW2   MAE\n#&gt;        &amp;  &amp; &amp;   &amp; &amp; &amp; &amp; &amp; &amp;\n#&gt;  1 4842        1     1      1     1       1     1     1     1     1     1\n#&gt;  2 4843        1     1      1     1       1     1     1     1     1     1\n#&gt;  3 4844        1     1      1     1       1     1     1     1     1     1\n#&gt;  4 4845        1     1      1     1       1    NA    NA    NA    NA    NA\n#&gt;  5 4847        1     1      1    NA      NA    NA    NA    NA    NA    NA\n#&gt;  6 4848        1     1      1     1      NA    NA    NA    NA    NA    NA\n#&gt;  7 4849        1     1     NA    NA      NA    NA    NA    NA    NA    NA\n#&gt;  8 4850        1     1     NA     1       1     1     1    NA    NA    NA\n#&gt;  9 4851        1     1     NA    NA      NA    NA    NA    NA    NA    NA\n#&gt; 10 4854        1     1     NA    NA      NA    NA    NA    NA    NA    NA\n#&gt;  # \u2026 avec 9 autres lignes, et 1 autre variable : MAW<\/code><\/pre>\n<p><\/p>\n<p>Ce jeu de donn\u00e9es enregistre des informations uniquement lorsque le poisson a \u00e9t\u00e9 d\u00e9tect\u00e9 par la station, c'est-\u00e0-dire si un poisson n'a pas \u00e9t\u00e9 enregistr\u00e9 par une station, ces donn\u00e9es ne seront pas pr\u00e9sentes dans le tableau. Cela signifie que les donn\u00e9es de sortie seront remplies de NA. <\/p>\n<p><\/p>\n<p>Cependant, dans ce cas, nous savons que l'absence d'enregistrement signifie que le poisson n'a pas \u00e9t\u00e9 observ\u00e9, donc nous pouvons utiliser l'argument <em>values_fill<\/em> dans la fonction <code>pivot_wider()<\/code> et remplir ces valeurs manquantes avec des z\u00e9ros :<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">fish_encounters %&gt;% pivot_wider(\n  names_from = station, \n  values_from = seen,\n  values_fill = list(seen = 0)\n)<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 19 x 12\n#&gt;    fish  Release I80_1 Lisbon  Rstr Base_TD   BCE   BCW  BCE2  BCW2   MAE\n#&gt;    &lt;fct&gt;   &lt;int&gt; &lt;int&gt;  &lt;int&gt; &lt;int&gt;   &lt;int&gt; &lt;int&gt; &lt;int&gt; &lt;int&gt; &lt;int&gt; &lt;int&gt;\n#&gt;  1 4842        1     1      1     1       1     1     1     1     1     1\n#&gt;  2 4843        1     1      1     1       1     1     1     1     1     1\n#&gt;  3 4844        1     1      1     1       1     1     1     1     1     1\n#&gt;  4 4845        1     1      1     1       1     0     0     0     0     0\n#&gt;  5 4847        1     1      1     0       0     0     0     0     0     0\n#&gt;  6 4848        1     1      1     1       0     0     0     0     0     0\n#&gt;  7 4849        1     1      0     0       0     0     0     0     0     0\n#&gt;  8 4850        1     1      0     1       1     1     1     0     0     0\n#&gt;  9 4851        1     1      0     0       0     0     0     0     0     0\n#&gt; 10 4854        1     1      0     0       0     0     0     0     0     0\n#&gt; # \u2026 with 9 more rows, and 1 more variable: MAW &lt;int&gt;<\/code><\/pre>\n<p><\/p>\n<h3 id=\"generaciya-imeni-stolbca-iz-neskolkih-ishodnyh-peremennyh\">G\u00e9n\u00e9ration du nom de colonne \u00e0 partir de plusieurs variables d'origine<\/h3>\n<p><\/p>\n<p>Imaginez que nous avons un tableau contenant une combinaison de produit, pays et ann\u00e9e. Pour g\u00e9n\u00e9rer un cadre de donn\u00e9es de test, vous pouvez ex\u00e9cuter le code suivant :<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">df %\n  filter((product == \"A\" &amp; country == \"AI\") | product == \"B\") %&gt;% \n  mutate(value = rnorm(nrow(.)))<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 45 x 4\n#&gt;    product country  year    value\n#&gt;    &lt;chr&gt;   &lt;chr&gt;   &lt;int&gt;    &lt;dbl&gt;\n#&gt;  1 A       AI       2000 -2.05   \n#&gt;  2 A       AI       2001 -0.676  \n#&gt;  3 A       AI       2002  1.60   \n#&gt;  4 A       AI       2003 -0.353  \n#&gt;  5 A       AI       2004 -0.00530\n#&gt;  6 A       AI       2005  0.442  \n#&gt;  7 A       AI       2006 -0.610  \n#&gt;  8 A       AI       2007 -2.77   \n#&gt;  9 A       AI       2008  0.899  \n#&gt; 10 A       AI       2009 -0.106  \n#&gt; # \u2026 with 35 more rows<\/code><\/pre>\n<p><\/p>\n<p>Notre t\u00e2che est d'\u00e9largir le cadre de donn\u00e9es de mani\u00e8re \u00e0 ce qu'une colonne contienne des donn\u00e9es pour chaque combinaison de produit et de pays. Pour cela, il suffit de passer dans l'argument <em>names_from<\/em> un vecteur contenant les noms des champs \u00e0 combiner.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">df %&gt;% pivot_wider(names_from = c(product, country),\n                 values_from = \"value\")<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 15 x 4\n#&gt;     year     A_AI    B_AI    B_EI\n#&gt;    &lt;int&gt;    &lt;dbl&gt;   &lt;dbl&gt;   &lt;dbl&gt;\n#&gt;  1  2000 -2.05     0.607   1.20  \n#&gt;  2  2001 -0.676    1.65   -0.114 \n#&gt;  3  2002  1.60    -0.0245  0.501 \n#&gt;  4  2003 -0.353    1.30   -0.459 \n#&gt;  5  2004 -0.00530  0.921  -0.0589\n#&gt;  6  2005  0.442   -1.55    0.594 \n#&gt;  7  2006 -0.610    0.380  -1.28  \n#&gt;  8  2007 -2.77     0.830   0.637 \n#&gt;  9  2008  0.899    0.0175 -1.30  \n#&gt; 10  2009 -0.106   -0.195   1.03  \n#&gt; # \u2026 with 5 more rows<\/code><\/pre>\n<p><\/p>\n<p>Vous pouvez \u00e9galement appliquer des sp\u00e9cifications \u00e0 la fonction <code>pivot_wider()<\/code>. Mais lorsqu'il est fourni dans <code>pivot_wider()<\/code> la sp\u00e9cification effectue une transformation oppos\u00e9e <code>pivot_longer()<\/code>: des colonnes sont cr\u00e9\u00e9es, comme indiqu\u00e9 dans <em>.name<\/em>, en utilisant des valeurs de <em>.value<\/em> et d'autres colonnes.<\/p>\n<p><\/p>\n<p>Pour cet ensemble de donn\u00e9es, vous pouvez g\u00e9n\u00e9rer une sp\u00e9cification personnalis\u00e9e si vous souhaitez que chaque combinaison possible de pays et de produit ait sa propre colonne, et non seulement celles pr\u00e9sentes dans les donn\u00e9es :<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec % \n  expand(product, country, .value = \"value\") %&gt;% \n  unite(\".name\", product, country, remove = FALSE)<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 4 x 4\n#&gt;   .name product country .value\n#&gt;   &lt;chr&gt; &lt;chr&gt;   &lt;chr&gt;   &lt;chr&gt; \n#&gt; 1 A_AI  A       AI      value \n#&gt; 2 A_EI  A       EI      value \n#&gt; 3 B_AI  B       AI      value \n#&gt; 4 B_EI  B       EI      value<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">df %&gt;% pivot_wider(spec = spec) %&gt;% head()<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 6 x 5\n#&gt;    year     A_AI  A_EI    B_AI    B_EI\n#&gt;   &lt;int&gt;    &lt;dbl&gt; &lt;dbl&gt;   &lt;dbl&gt;   &lt;dbl&gt;\n#&gt; 1  2000 -2.05       NA  0.607   1.20  \n#&gt; 2  2001 -0.676      NA  1.65   -0.114 \n#&gt; 3  2002  1.60       NA -0.0245  0.501 \n#&gt; 4  2003 -0.353      NA  1.30   -0.459 \n#&gt; 5  2004 -0.00530    NA  0.921  -0.0589\n#&gt; 6  2005  0.442      NA -1.55    0.594<\/code><\/pre>\n<p><\/p>\n<h2 id=\"neskolko-prodvinutyh-primerov-raboty-s-novoy-koncepciey-tidyr\">Quelques exemples avanc\u00e9s de travail avec le nouveau concept de tidyr<\/h2>\n<p><\/p>\n<h3 id=\"privedenie-dannyh-k-akkuratnomu-vidu-na-primere-nabora-dannyh-o-perepisi-dohoda-i-arendnoy-platy-v-ssha\">Mettre les donn\u00e9es en forme soign\u00e9e \u00e0 l'aide d'un ensemble de donn\u00e9es sur les revenus et les loyers aux \u00c9tats-Unis<\/h3>\n<p><\/p>\n<p>Jeu de donn\u00e9es <em>us_rent_income<\/em> contient des informations sur le revenu moyen et le loyer pour chaque \u00c9tat des \u00c9tats-Unis pour l'ann\u00e9e 2017 (l'ensemble de donn\u00e9es est disponible dans le package <strong>tidycensus<\/strong>).<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">us_rent_income\n#&gt; # A tibble: 104 x 5\n#&gt;    GEOID NAME       variable estimate   moe\n#&gt;                   \n#&gt;  1 01    Alabama    income      24476   136\n#&gt;  2 01    Alabama    rent          747     3\n#&gt;  3 02    Alaska     income      32940   508\n#&gt;  4 02    Alaska     rent         1200    13\n#&gt;  5 04    Arizona    income      27517   148\n#&gt;  6 04    Arizona    rent          972     4\n#&gt;  7 05    Arkansas   income      23789   165\n#&gt;  8 05    Arkansas   rent          709     5\n#&gt;  9 06    Californie income      29454   109\n#&gt; 10 06    Californie rent         1358     3\n#&gt; # \u2026 avec 94 lignes suppl\u00e9mentaires<\/code><\/pre>\n<p><\/p>\n<p>Dans la forme dans laquelle les donn\u00e9es sont conserv\u00e9es dans l'ensemble de donn\u00e9es <em>us_rent_income<\/em> il est tr\u00e8s compliqu\u00e9 de travailler avec, donc nous aimerions cr\u00e9er un ensemble de donn\u00e9es avec les colonnes : <em>rent<\/em>, <em>rent_moe<\/em>, <em>come<\/em>, <em>income_moe<\/em>. Il existe de nombreuses fa\u00e7ons de cr\u00e9er cette sp\u00e9cification, mais l'essentiel est que nous devons g\u00e9n\u00e9rer chaque combinaison de valeurs de la variable et <em>estimate\/moe<\/em>, puis g\u00e9n\u00e9rer le nom de la colonne.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">  spec % \n    expand(variable, .value = c(\"estimate\", \"moe\")) %&gt;% \n    mutate(\n      .name = paste0(variable, ifelse(.value == \"moe\", \"_moe\", \"\"))\n    )<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 4 x 3\n#&gt;   variable .value   .name     \n#&gt;   &lt;chr&gt;    &lt;chr&gt;    &lt;chr&gt;     \n#&gt; 1 income   estimate income    \n#&gt; 2 income   moe      income_moe\n#&gt; 3 rent     estimate rent      \n#&gt; 4 rent     moe      rent_moe<\/code><\/pre>\n<p><\/p>\n<p>La fourniture de cette sp\u00e9cification <code>pivot_wider()<\/code> nous donne le r\u00e9sultat que nous recherchons :<\/p>\n<p><\/p>\n<p><code>us_rent_income %&gt;% pivot_wider(spec = spec)<\/code><\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 52 x 6\n#&gt;    GEOID NAME                 income income_moe  rent rent_moe\n#&gt;    &lt;chr&gt; &lt;chr&gt;                 &lt;dbl&gt;      &lt;dbl&gt; &lt;dbl&gt;    &lt;dbl&gt;\n#&gt;  1 01    Alabama               24476        136   747        3\n#&gt;  2 02    Alaska                32940        508  1200       13\n#&gt;  3 04    Arizona               27517        148   972        4\n#&gt;  4 05    Arkansas              23789        165   709        5\n#&gt;  5 06    California            29454        109  1358        3\n#&gt;  6 08    Colorado              32401        109  1125        5\n#&gt;  7 09    Connecticut           35326        195  1123        5\n#&gt;  8 10    Delaware              31560        247  1076       10\n#&gt;  9 11    District of Columbia  43198        681  1424       17\n#&gt; 10 12    Florida               25952         70  1077        3\n#&gt; # \u2026 with 42 more rows<\/code><\/pre>\n<p><\/p>\n<h3 id=\"vsemirnyy-bank\">Banque mondiale<\/h3>\n<p><\/p>\n<p>Parfois, mettre un ensemble de donn\u00e9es sous la forme souhait\u00e9e n\u00e9cessite plusieurs \u00e9tapes.<br \/>\nJeu de donn\u00e9es <em>world_bank_pop<\/em> contient des donn\u00e9es de la Banque mondiale sur la population de chaque pays entre 2000 et 2018.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 1,056 x 20\n#&gt;    country indicator `2000` `2001` `2002` `2003`  `2004`  `2005`   `2006`\n#&gt;    &lt;chr&gt;   &lt;chr&gt;      &lt;dbl&gt;  &lt;dbl&gt;  &lt;dbl&gt;  &lt;dbl&gt;   &lt;dbl&gt;   &lt;dbl&gt;    &lt;dbl&gt;\n#&gt;  1 ABW     SP.URB.T\u2026 4.24e4 4.30e4 4.37e4 4.42e4 4.47e+4 4.49e+4  4.49e+4\n#&gt;  2 ABW     SP.URB.G\u2026 1.18e0 1.41e0 1.43e0 1.31e0 9.51e-1 4.91e-1 -1.78e-2\n#&gt;  3 ABW     SP.POP.T\u2026 9.09e4 9.29e4 9.50e4 9.70e4 9.87e+4 1.00e+5  1.01e+5\n#&gt;  4 ABW     SP.POP.G\u2026 2.06e0 2.23e0 2.23e0 2.11e0 1.76e+0 1.30e+0  7.98e-1\n#&gt;  5 AFG     SP.URB.T\u2026 4.44e6 4.65e6 4.89e6 5.16e6 5.43e+6 5.69e+6  5.93e+6\n#&gt;  6 AFG     SP.URB.G\u2026 3.91e0 4.66e0 5.13e0 5.23e0 5.12e+0 4.77e+0  4.12e+0\n#&gt;  7 AFG     SP.POP.T\u2026 2.01e7 2.10e7 2.20e7 2.31e7 2.41e+7 2.51e+7  2.59e+7\n#&gt;  8 AFG     SP.POP.G\u2026 3.49e0 4.25e0 4.72e0 4.82e0 4.47e+0 3.87e+0  3.23e+0\n#&gt;  9 AGO     SP.URB.T\u2026 8.23e6 8.71e6 9.22e6 9.77e6 1.03e+7 1.09e+7  1.15e+7\n#&gt; 10 AGO     SP.URB.G\u2026 5.44e0 5.59e0 5.70e0 5.76e0 5.75e+0 5.69e+0  4.92e+0\n#&gt; # \u2026 with 1,046 more rows, and 11 more variables: `2007` &lt;dbl&gt;,\n#&gt; #   `2008` &lt;dbl&gt;, `2009` &lt;dbl&gt;, `2010` &lt;dbl&gt;, `2011` &lt;dbl&gt;, `2012` &lt;dbl&gt;,\n#&gt; #   `2013` &lt;dbl&gt;, `2014` &lt;dbl&gt;, `2015` &lt;dbl&gt;, `2016` &lt;dbl&gt;, `2017` &lt;dbl&gt;<\/code><\/pre>\n<p><\/p>\n<p>Notre objectif est de cr\u00e9er un ensemble de donn\u00e9es soign\u00e9, o\u00f9 chaque variable se trouve dans une colonne distincte. Il n'est pas encore clair quelles \u00e9tapes exactes sont n\u00e9cessaires, mais nous commencerons par le probl\u00e8me le plus \u00e9vident : l'ann\u00e9e est r\u00e9partie sur plusieurs colonnes.<\/p>\n<p><\/p>\n<p>Pour corriger cela, il est n\u00e9cessaire d'utiliser la fonction <code>pivot_longer()<\/code>.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">pop2 % \n  pivot_longer(`2000`:`2017`, names_to = \"year\")<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 19,008 x 4\n#&gt;    country indicator   year  value\n#&gt;    &lt;chr&gt;   &lt;chr&gt;       &lt;chr&gt; &lt;dbl&gt;\n#&gt;  1 ABW     SP.URB.TOTL 2000  42444\n#&gt;  2 ABW     SP.URB.TOTL 2001  43048\n#&gt;  3 ABW     SP.URB.TOTL 2002  43670\n#&gt;  4 ABW     SP.URB.TOTL 2003  44246\n#&gt;  5 ABW     SP.URB.TOTL 2004  44669\n#&gt;  6 ABW     SP.URB.TOTL 2005  44889\n#&gt;  7 ABW     SP.URB.TOTL 2006  44881\n#&gt;  8 ABW     SP.URB.TOTL 2007  44686\n#&gt;  9 ABW     SP.URB.TOTL 2008  44375\n#&gt; 10 ABW     SP.URB.TOTL 2009  44052\n#&gt; # \u2026 with 18,998 more rows<\/code><\/pre>\n<p><\/p>\n<p>La prochaine \u00e9tape est d'examiner la variable indicator.<br \/>\n<code>pop2 %&gt;% count(indicator)<\/code><\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 4 x 2\n#&gt;   indicator       n\n#&gt;   &lt;chr&gt;       &lt;int&gt;\n#&gt; 1 SP.POP.GROW  4752\n#&gt; 2 SP.POP.TOTL  4752\n#&gt; 3 SP.URB.GROW  4752\n#&gt; 4 SP.URB.TOTL  4752<\/code><\/pre>\n<p><\/p>\n<p>O\u00f9 SP.POP.GROW repr\u00e9sente la croissance de la population, SP.POP.TOTL est la population totale, et SP.URB. * est pareil, mais uniquement pour les zones urbaines. Divisons ces valeurs en deux variables : area \u2014 zone (total ou urbain) et une variable contenant les donn\u00e9es r\u00e9elles (population ou croissance) :<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">pop3 % \n  separate(indicator, c(NA, \"area\", \"variable\"))<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 19,008 x 5\n#&gt;    country area  variable year  value\n#&gt;    &lt;chr&gt;   &lt;chr&gt; &lt;chr&gt;    &lt;chr&gt; &lt;dbl&gt;\n#&gt;  1 ABW     URB   TOTL     2000  42444\n#&gt;  2 ABW     URB   TOTL     2001  43048\n#&gt;  3 ABW     URB   TOTL     2002  43670\n#&gt;  4 ABW     URB   TOTL     2003  44246\n#&gt;  5 ABW     URB   TOTL     2004  44669\n#&gt;  6 ABW     URB   TOTL     2005  44889\n#&gt;  7 ABW     URB   TOTL     2006  44881\n#&gt;  8 ABW     URB   TOTL     2007  44686\n#&gt;  9 ABW     URB   TOTL     2008  44375\n#&gt; 10 ABW     URB   TOTL     2009  44052\n#&gt; # \u2026 with 18,998 more rows<\/code><\/pre>\n<p><\/p>\n<p>Il nous reste maintenant \u00e0 diviser la variable variable en deux colonnes :<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">pop3 %&gt;% \n  pivot_wider(names_from = variable, values_from = value)<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 9,504 x 5\n#&gt;    country area  year   TOTL    GROW\n#&gt;    &lt;chr&gt;   &lt;chr&gt; &lt;chr&gt; &lt;dbl&gt;   &lt;dbl&gt;\n#&gt;  1 ABW     URB   2000  42444  1.18  \n#&gt;  2 ABW     URB   2001  43048  1.41  \n#&gt;  3 ABW     URB   2002  43670  1.43  \n#&gt;  4 ABW     URB   2003  44246  1.31  \n#&gt;  5 ABW     URB   2004  44669  0.951 \n#&gt;  6 ABW     URB   2005  44889  0.491 \n#&gt;  7 ABW     URB   2006  44881 -0.0178\n#&gt;  8 ABW     URB   2007  44686 -0.435 \n#&gt;  9 ABW     URB   2008  44375 -0.698 \n#&gt; 10 ABW     URB   2009  44052 -0.731 \n#&gt; # \u2026 with 9,494 more rows<\/code><\/pre>\n<p><\/p>\n<h3 id=\"spisok-kontaktov\">Liste des contacts<\/h3>\n<p><\/p>\n<p>Pour le dernier exemple, imaginez que vous avez une liste de contacts que vous avez copi\u00e9e depuis un site web :<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">contacts &lt;- tribble(\n  ~field, ~value,\n  &quot;name&quot;, &quot;Jiena McLellan&quot;,\n  &quot;company&quot;, &quot;Toyota&quot;, \n  &quot;name&quot;, &quot;John Smith&quot;, \n  &quot;company&quot;, &quot;google&quot;, \n  &quot;email&quot;, &quot;john@google.com&quot;,\n  &quot;name&quot;, &quot;Huxley Ratcliffe&quot;\n)<\/code><\/pre>\n<p><\/p>\n<p>Il est assez difficile de mettre cette liste sous forme de tableau, car il n'y a pas de variable qui identifie quelles donn\u00e9es appartiennent \u00e0 quel contact. Nous pouvons corriger cela en remarquant que les donn\u00e9es de chaque nouveau contact commencent par le nom (&quot;name&quot;), donc nous pouvons cr\u00e9er un identifiant unique et l'augmenter de un chaque fois qu'une valeur \u00ab name \u00bb appara\u00eet dans la colonne field :<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">contacts &lt;- contacts %&gt;% \n  mutate(\n    person_id = cumsum(field == &quot;name&quot;)\n  )\ncontacts<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 6 x 3\n#&gt;   field   value            person_id\n#&gt;   &lt;chr&gt;   &lt;chr&gt;                &lt;int&gt;\n#&gt; 1 name    Jiena McLellan           1\n#&gt; 2 company Toyota                   1\n#&gt; 3 name    John Smith               2\n#&gt; 4 company google                   2\n#&gt; 5 email   john@google.com          2\n#&gt; 6 name    Huxley Ratcliffe         3<\/code><\/pre>\n<p><\/p>\n<p>Maintenant que nous avons un identifiant unique pour chaque contact, nous pouvons pivoter le champ et la valeur en colonnes :<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">contacts %&gt;% \n  pivot_wider(names_from = field, values_from = value)<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 3 x 4\n#&gt;   person_id name             company email          \n#&gt;       &lt;int&gt; &lt;chr&gt;            &lt;chr&gt;   &lt;chr&gt;          \n#&gt; 1         1 Jiena McLellan   Toyota  &lt;NA&gt;           \n#&gt; 2         2 John Smith       google  john@google.com\n#&gt; 3         3 Huxley Ratcliffe &lt;NA&gt;    &lt;NA&gt;<\/code><\/pre>\n<p><\/p>\n<h2 id=\"zaklyuchenie\">Conclusion<\/h2>\n<p><\/p>\n<p>Personnellement, je pense que le nouveau concept <strong>tidyr<\/strong> est vraiment intuitivement plus \u00e9vident et surpasse de loin les fonctions obsol\u00e8tes. <code>spread()<\/code> et <code>gather()<\/code>. J'esp\u00e8re que cet article vous a aid\u00e9 \u00e0 comprendre <code>pivot_longer()<\/code> et <code>pivot_wider()<\/code>.<\/p>\n<p>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/444622\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0430\u043a\u0435\u0442 tidyr \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u044f\u0434\u0440\u043e \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 R \u2014 tidyverse. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 \u2014 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e\u043c\u0443 \u0432\u0438\u0434\u0443. \u041d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0451\u043d\u043d\u0430\u044f \u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u043f\u0430\u043a\u0435\u0442\u0443, \u043d\u043e \u0434\u0430\u0442\u0438\u0440\u0443\u044e\u0435\u0442\u0441\u044f \u043e\u043d\u0430 2015 \u0433\u043e\u0434\u043e\u043c. \u0410 \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043e \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0445, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043d\u0435\u0439 \u043d\u0430\u0437\u0430\u0434 \u0441\u043e\u043e\u0431\u0449\u0438\u043b \u0435\u0433\u043e \u0430\u0432\u0442\u043e\u0440 \u0425\u0435\u0434\u043b\u0438 \u0412\u0438\u043a\u0445\u0435\u043c. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":76292,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-76291","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0430\u043a\u0435\u0442 tidyr \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u044f\u0434\u0440\u043e \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 R \u2014 tidyverse. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 \u2014 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e\u043c\u0443 \u0432\u0438\u0434\u0443. \u041d\u0430 \u0425\u0430\u0431\u0440\u0435.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/r-paket-tidyr-i-ego-novye-funkczii-pivot_longer-i-pivot_wider\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47R \u043f\u0430\u043a\u0435\u0442 tidyr \u0438 \u0435\u0433\u043e \u043d\u043e\u0432\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 pivot_longer \u0438 pivot_wider | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0430\u043a\u0435\u0442 tidyr \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u044f\u0434\u0440\u043e \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 R \u2014 tidyverse. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 \u2014 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e\u043c\u0443 \u0432\u0438\u0434\u0443. \u041d\u0430 \u0425\u0430\u0431\u0440\u0435.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/r-paket-tidyr-i-ego-novye-funkczii-pivot_longer-i-pivot_wider\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-04-01T11:42:28+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-04-01T11:42:28+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Le package R tidyr et ses nouvelles fonctionnalit\u00e9s pivot_longer et pivot_wider | ProHoster","description":"Le paquet tidyr fait partie de l'un des biblioth\u00e8ques les plus populaires dans le langage R \u2014 tidyverse. La principale fonction du paquet est de mettre les donn\u00e9es sous une forme soign\u00e9e. Sur Habr.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/r-paket-tidyr-i-ego-novye-funkczii-pivot_longer-i-pivot_wider","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47R \u043f\u0430\u043a\u0435\u0442 tidyr \u0438 \u0435\u0433\u043e \u043d\u043e\u0432\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 pivot_longer \u0438 pivot_wider | ProHoster","og:description":"\u041f\u0430\u043a\u0435\u0442 tidyr \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u044f\u0434\u0440\u043e \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 R \u2014 tidyverse. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 \u2014 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e\u043c\u0443 \u0432\u0438\u0434\u0443. \u041d\u0430 \u0425\u0430\u0431\u0440\u0435.","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/r-paket-tidyr-i-ego-novye-funkczii-pivot_longer-i-pivot_wider","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-04-01T11:42:28+00:00","article:modified_time":"2020-04-01T11:42:28+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"76291","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 17:39:23","updated":"2022-09-28 03:21:22","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/76291","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=76291"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/76291\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/76292"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=76291"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=76291"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=76291"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}