{"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\/ro\/blog\/administrirovanie\/r-paket-tidyr-i-ego-novye-funkczii-pivot_longer-i-pivot_wider","title":{"rendered":"The R package tidyr and its new functions pivot_longer and pivot_wider.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Pachet <strong>tidyr<\/strong> face parte din nucleul uneia dintre cele mai populare biblioteci \u00een R \u2014 <strong>tidyverse<\/strong>.<br \/>\nScopul principal al pachetului este de a aduce datele \u00eentr-o form\u0103 ordonat\u0103.<\/p>\n<p><\/p>\n<p>Pe Habr exist\u0103 deja <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/248741\/\">publica\u021bie<\/a><\/noindex> dedicat\u0103 acestui pachet, dar este datat\u0103 din 2015. Vreau s\u0103 vorbesc despre cele mai recente modific\u0103ri anun\u021bate cu c\u00e2teva zile \u00een urm\u0103 de autorul s\u0103u, Hadley Wickham.<\/p>\n<p>\n<img decoding=\"async\" alt=\"The R package tidyr and its new functions pivot_longer and pivot_wider.\" src=\"\/wp-content\/uploads\/2020\/04\/a290263b63aaea3db70e83a1ec411415.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<blockquote><p><b>SJK<\/b>: Func\u021biile gather() \u0219i spread() vor fi considerate \u00eenvechite?<\/p>\n<p><b>Hadley Wickham<\/b>: \u00centr-o anumit\u0103 m\u0103sur\u0103. Vom \u00eenceta s\u0103 recomand\u0103m utilizarea acestor func\u021bii \u0219i s\u0103 corect\u0103m erorile din ele, dar ele vor r\u0103m\u00e2ne disponibile \u00een pachet \u00een starea actual\u0103.<\/p><\/blockquote>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"soderzhanie\">Cuprins<\/h2>\n<p><\/p>\n<p><em>Dac\u0103 sunte\u021bi interesat de analiza datelor, s-ar putea s\u0103 v\u0103 intereseze canalele mele. <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/R4marketing\">telegram<\/a><\/noindex> \u0219i <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/R4marketing\/?sub_confirmation=1\">youtube<\/a><\/noindex> Majoritatea con\u021binutului care este dedicat limbajului R.<\/em><\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"#koncepciya-tidydata\">Conceptul TidyData<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#osnovnye-funkcii-vhodyaschie-v-paket-tydir\">Func\u021biile principale incluse \u00een pachetul tidyr<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#novaya-koncepciya-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy-i-naoborot\">Noua concep\u021bie de transformare a datelor din format larg \u00een lung \u0219i invers<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/ustnovka-naibolee-aktualnoy-versii-tidyr-0839000\">Instalarea celei mai recente versiuni tidyr 0.8.3.9000<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#perehod-na-novye-funkcii\">Trecerea la noi func\u021bii<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#prostoy-primer-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy\">Un exemplu simplu de transformare a datelor din format larg \u00een lung<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#specifikacii\">Specificatii<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#specifikaciya-s-ispolzovaniem-neskolkih-znacheniyvalue\">Specifica\u021bie cu utilizarea mai multor valori (.value)<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#preobrazovanie-data-freymov-iz-dlinnogo-formata-k-shirokomu\">Transformarea data frame-urilor din format lung \u00een larg<\/a><\/noindex>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"#prosteyshiy-primer-privedeniya-tablicy-k-shirokomu-formatu\">Cel mai simplu exemplu de aducere a unei tabele \u00een format larg<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#generaciya-imeni-stolbca-iz-neskolkih-ishodnyh-peremennyh\">Generarea numelui coloanei din mai multe variabile de baz\u0103<\/a><\/noindex><\/li>\n<\/ul>\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#neskolko-prodvinutyh-primerov-raboty-s-novoy-koncepciey-tidyr\">C\u00e2teva exemple avansate de lucru cu noua concep\u021bie 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\">Aducerea datelor \u00eentr-o form\u0103 ordonat\u0103 folosind un set de date despre recens\u0103m\u00e2ntul veniturilor \u0219i chiriei din SUA<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#vsemirnyy-bank\">Banca Mondial\u0103<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#spisok-kontaktov\">Lista de contacte<\/a><\/noindex><\/li>\n<\/ul>\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#zaklyuchenie\">Concluzie<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"koncepciya-tidydata\">Conceptul TidyData<\/h2>\n<p><\/p>\n<p>Scop <strong>tidyr<\/strong> \u2014 s\u0103 v\u0103 ajute s\u0103 transforma\u021bi datele \u00eentr-o a\u0219a-numit\u0103 form\u0103 ordonat\u0103. Datele ordonate sunt date \u00een care: <\/p>\n<p><\/p>\n<ul>\n<li>Fiecare variabil\u0103 este \u00eentr-o coloan\u0103. <\/li>\n<li>Fiecare observa\u021bie este un r\u00e2nd. <\/li>\n<li>Fiecare valoare este o celul\u0103.<\/li>\n<\/ul>\n<p><\/p>\n<p>Lucrul cu datele aduse la tidy data este semnificativ mai simplu \u0219i mai convenabil \u00een analiza acestora.<\/p>\n<p><\/p>\n<h2 id=\"osnovnye-funkcii-vhodyaschie-v-paket-tidyr\">Func\u021biile principale incluse \u00een pachetul tidyr<\/h2>\n<p><\/p>\n<p>tidyr con\u021bine un set de func\u021bii destinate transform\u0103rii tabelilor:<\/p>\n<p><\/p>\n<ul>\n<li><code>fill()<\/code> \u2014 completarea valorilor lips\u0103 din coloan\u0103, cu valorile anterioare;<\/li>\n<li><code>separate()<\/code> \u2014 \u00eemparte un c\u00e2mp \u00een mai multe, printr-un separator;<\/li>\n<li><code>unite()<\/code> \u2014 efectueaz\u0103 opera\u021bia de unificare a mai multor c\u00e2mpuri \u00eentr-unul, ac\u021biunea opus\u0103 func\u021biei <code>separate()<\/code>;<\/li>\n<li><code>pivot_longer()<\/code> \u2014 func\u021bia care transform\u0103 datele din format larg \u00een lung;<\/li>\n<li><code>pivot_wider()<\/code> \u2014 func\u021bia care transform\u0103 datele din format lung \u00een larg. Opera\u021bia este opus\u0103 celei efectuate de func\u021bia <code>pivot_longer()<\/code>.<\/li>\n<li><code>gather()<\/code><strong>\u00eenvechit\u0103<\/strong> \u2014 func\u021bia care transform\u0103 datele din format larg \u00een lung;<\/li>\n<li><code>spread()<\/code><strong>\u00eenvechit\u0103<\/strong> \u2014 func\u021bia care transform\u0103 datele din format lung \u00een larg. Opera\u021bia este opus\u0103 celei efectuate de func\u021bia <code>gather()<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"novaya-koncepciya-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy-i-naoborot\">Noua concep\u021bie de transformare a datelor din format larg \u00een lung \u0219i invers<\/h2>\n<p><\/p>\n<p>Anterior, pentru acest tip de transformare erau folosite func\u021biile <code>gather()<\/code> \u0219i <code>spread()<\/code>. De-a lungul anilor de existen\u021b\u0103 a acestor func\u021bii, a devenit evident c\u0103, pentru majoritatea utilizatorilor, inclusiv pentru autorul pachetului, numele acestor func\u021bii \u0219i argumentele lor erau destul de neclare \u0219i provocau dificult\u0103\u021bi \u00een c\u0103utarea \u0219i \u00een\u021belegerea acelei func\u021bii care transform\u0103 un cadru de date din format larg \u00een format lung \u0219i invers.<\/p>\n<p><\/p>\n<p>Din acest motiv, <strong>tidyr<\/strong> au fost ad\u0103ugate dou\u0103 func\u021bii noi, importante, care sunt destinate transform\u0103rii cadrelor de date.<\/p>\n<p><\/p>\n<p>Func\u021bii noi <code>pivot_longer()<\/code> \u0219i <code>pivot_wider()<\/code> au fost create sub influen\u021ba unor func\u021bii din pachetul <strong>cdata<\/strong>, creat de John Mount \u0219i Nina Zumel.<\/p>\n<p><\/p>\n<h3 id=\"ustanovka-naibolee-aktualnoy-versii-tidyr-0839000\">Instalarea celei mai recente versiuni tidyr 0.8.3.9000<\/h3>\n<p><\/p>\n<p>Pentru a instala cea mai recent\u0103 versiune a pachetului, <strong>tidyr<\/strong> <em>0.8.3.9000<\/em>, \u00een care sunt disponibile noile func\u021bii, utiliza\u021bi urm\u0103torul cod.<\/p>\n<p><\/p>\n<p><code>devtools::install_github(\"tidyverse\/tidyr\")<\/code><\/p>\n<p><\/p>\n<p>La momentul redact\u0103rii acestui articol, aceste func\u021bii sunt disponibile doar \u00een versiunea dev a pachetului pe GitHub.<\/p>\n<p><\/p>\n<h3 id=\"perehod-na-novye-funkcii\">Trecerea la noi func\u021bii<\/h3>\n<p><\/p>\n<p>De fapt, nu este complicat s\u0103 traduci vechile scripturi pentru a lucra cu noile func\u021bii; pentru o mai bun\u0103 \u00een\u021belegere, voi lua un exemplu din documenta\u021bia vechilor func\u021bii \u0219i voi ar\u0103ta cum aceste opera\u021biuni sunt realizate folosind noile <code>pivot_*()<\/code> func\u021bii.<\/p>\n<p><\/p>\n<p>Transformarea din format larg \u00een format lung.<\/p>\n<p>\n<b class=\"spoiler_title\">Exemplu de cod din documenta\u021bia func\u021biei 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>Transformarea din format lung \u00een format larg.<\/p>\n<p>\n<b class=\"spoiler_title\">Exemplu de cod din documenta\u021bia func\u021biei 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>Dac\u0103 \u00een exemplele de mai sus de lucru cu <code>pivot_longer()<\/code> \u0219i <code>pivot_wider()<\/code>, \u00een tabelul ini\u021bial, <em>stocks<\/em> nu sunt coloane enumerate \u00een argumentele <em>names_to<\/em> \u0219i <em>values_to<\/em> numele lor trebuie specificate \u00een ghilimele.<\/p>\n<p><\/p>\n<p>Un tabel cu ajutorul c\u0103ruia \u00ee\u021bi va fi cel mai u\u0219or s\u0103 \u00een\u021belegi cum s\u0103 treci la noua conceptie <strong>tidyr<\/strong>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"The R package tidyr and its new functions pivot_longer and 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\">Nota autorului<\/h2>\n<p><\/p>\n<blockquote><p>\u00centregul text care urmeaz\u0103 este un traducere adaptiv\u0103, a\u0219 spune chiar liber\u0103, <noindex><a rel=\"nofollow\" href=\"https:\/\/tidyr.tidyverse.org\/dev\/articles\/pivot.html\">viniete<\/a><\/noindex> de pe site-ul oficial al bibliotecii tidyverse.<\/p><\/blockquote>\n<p><\/p>\n<h2 id=\"prostoy-primer-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy\">Un exemplu simplu de transformare a datelor din format larg \u00een lung<\/h2>\n<p><\/p>\n<p><code>pivot_longer ()<\/code> \u2014 face seturile de date mai lungi, reduc\u00e2nd num\u0103rul de coloane \u0219i cresc\u00e2nd num\u0103rul de r\u00e2nduri.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"The R package tidyr and its new functions pivot_longer and pivot_wider.\" src=\"\/wp-content\/uploads\/2020\/04\/fc88b99f2fecdcdaa6179d2e7d29e59d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pentru a efectua exemplele prezentate \u00een articol, este necesar mai \u00eent\u00e2i s\u0103 conectezi pachetele necesare:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">library(tidyr)\nlibrary(dplyr)\nlibrary(readr)<\/code><\/pre>\n<p><\/p>\n<p>S\u0103 presupunem c\u0103 avem un tabel cu rezultatele unui sondaj, \u00een care (printre altele) s-au \u00eentrebat oamenii despre religia lor \u0219i venitul anual:<\/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>Aceast\u0103 tabel\u0103 con\u021bine date despre religia responden\u021bilor \u00een r\u00e2nduri, iar nivelul venitului este dispus pe denumirile coloanelor. Num\u0103rul responden\u021bilor din fiecare categorie este stocat \u00een valorile celulelor la intersec\u021bia dintre religie \u0219i nivelul venitului. Pentru a aduce tabela \u00eentr-un format ordonat \u0219i corect, este suficient s\u0103 folose\u0219ti <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 Agnostic   2 Agnostic 10-20k               34\n#&gt;  3 Agnostic 20-30k               60\n#&gt;  4 Agnostic 30-40k               81\n#&gt;  5 Agnostic 40-50k               76\n#&gt;  6 Agnostic 50-75k              137\n#&gt;  7 Agnostic 75-100k             122\n#&gt;  8 Agnostic 100-150k            109\n#&gt;  9 Agnostic &gt;150k                 84\n#&gt; 10 Agnostic Don't know\/refused    96\n#&gt; # \u2026 with 170 more rows<\/code><\/pre>\n<p><\/p>\n<p>Argumentele func\u021biei <code>pivot_longer()<\/code><\/p>\n<p><\/p>\n<ul>\n<li>Primul argument <em>cols<\/em>, descrie ce coloane trebuie unite. \u00cen acest caz, toate coloanele, cu excep\u021bia <em>time<\/em>.<\/li>\n<li>Argumentul <em>names_to<\/em> d\u0103 un nume variabilei care va fi creat\u0103 din denumirile coloanelor pe care le-am unit.<\/li>\n<li><em>values_to<\/em> d\u0103 un nume variabilei care va fi creat\u0103 din datele stocate \u00een valorile celulelor coloanelor unite.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"specifikacii\">Specificatii<\/h2>\n<p><\/p>\n<p>Aceasta este o nou\u0103 func\u021bionalitate a pachetului <strong>tidyr<\/strong>, care anterior, \u00een lucrul cu func\u021bii \u00eenvechite, nu era disponibil\u0103.<\/p>\n<p><\/p>\n<p>Specifica\u021bia este un cadru de date, fiecare r\u00e2nd corespunde unei coloane din noul cadru de date de ie\u0219ire, \u0219i dou\u0103 coloane speciale care \u00eencep cu : <\/p>\n<p><\/p>\n<ul>\n<li><em>.name<\/em> con\u021bine denumirea original\u0103 a coloanei. <\/li>\n<li><em>.value<\/em> con\u021bine denumirea coloanei \u00een care vor intra valorile celulelor. <\/li>\n<\/ul>\n<p><\/p>\n<p>Celelalte coloane din specifica\u021bie reflect\u0103 modul \u00een care \u00een noua coloan\u0103 vor fi afi\u0219ate denumirile coloanelor comprimate din <em>.name<\/em>.<\/p>\n<p><\/p>\n<p>Specifica\u021bia descrie metadatele stocate \u00een denumirea coloanei, cu un r\u00e2nd pentru fiecare coloan\u0103 \u0219i o coloan\u0103 pentru fiecare variabil\u0103, unind-o cu denumirea coloanei, poate acum o astfel de defini\u021bie pare complicat\u0103, dar dup\u0103 examinarea c\u00e2torva exemple va fi mult mai clar.<\/p>\n<p><\/p>\n<p>Sensul specifica\u021biei este acela c\u0103 po\u021bi extrage, modifica \u0219i defini noi metadate pentru cadrul de date transformat.<\/p>\n<p><\/p>\n<p>Pentru a lucra cu specifica\u021biile la transformarea tabelului dintr-un format larg \u00eentr-unul lung, se folose\u0219te func\u021bia <code>pivot_longer_spec()<\/code>.<\/p>\n<p><\/p>\n<p>Cum func\u021bioneaz\u0103 aceast\u0103 func\u021bie, ea preia orice cadru de date \u0219i \u00ee\u0219i formeaz\u0103 metadatele \u00een modul descris mai sus. <\/p>\n<p><\/p>\n<p>Ca exemplu, s\u0103 lu\u0103m setul de date who, care este furnizat \u00eempreun\u0103 cu pachetul <strong>tidyr<\/strong>. Acest set de date con\u021bine informa\u021bii furnizate de Organiza\u021bia Mondial\u0103 a S\u0103n\u0103t\u0103\u021bii despre inciden\u021ba tuberculozei.<\/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;        &amp; &amp;                       \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 with 7,230 more rows, and 53 more variables<\/code><\/pre>\n<p><\/p>\n<p>S\u0103 construim specifica\u021bia acestuia.<\/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>C\u00e2mpuri <em>\u021bara<\/em>, <em>iso2<\/em>, <em>iso3<\/em> sunt deja variabile. Sarcina noastr\u0103 este s\u0103 invers\u0103m coloanele cu <em>new_sp_m014<\/em> pe <em>newrel_f65<\/em>.<\/p>\n<p><\/p>\n<p>\u00cen denumirile acestor coloane se afl\u0103 urm\u0103toarele informa\u021bii:<\/p>\n<p><\/p>\n<ul>\n<li>Prefix <code>new_<\/code> indic\u0103 faptul c\u0103 coloana con\u021bine date despre noi cazuri de tuberculoz\u0103, cadrul de date curent con\u021bine informa\u021bii doar despre noi \u00eemboln\u0103viri, prin urmare acest prefix nu are o \u00eenc\u0103rc\u0103tur\u0103 semnificativ\u0103 \u00een contextul actual.<\/li>\n<li><code>sp<\/code>\/<code>rel<\/code>\/<code>sp<\/code>\/<code>ep<\/code> descrie metoda de diagnosticare a bolii.<\/li>\n<li><code>m<\/code>\/<code>f<\/code> sexul pacientului.<\/li>\n<li><code>014<\/code>\/<code>1524<\/code>\/<code>2535<\/code>\/<code>3544<\/code>\/<code>4554<\/code>\/<code>65<\/code> intervalul de v\u00e2rst\u0103 al pacientului.<\/li>\n<\/ul>\n<p><\/p>\n<p>Putem separa aceste coloane folosind func\u021bia <code>extract()<\/code>, utiliz\u00e2nd o expresie regulat\u0103.<\/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>Re\u021bine\u021bi, coloana <em>.name<\/em> trebuie s\u0103 r\u0103m\u00e2n\u0103 neschimbat\u0103, deoarece este indexul nostru \u00een denumirile coloanelor setului de date surs\u0103. <\/p>\n<p><\/p>\n<p>Sexul \u0219i v\u00e2rsta (coloanele <em>gender<\/em> \u0219i <em>age<\/em>) au valori fixe \u0219i cunoscute, prin urmare este recomandat s\u0103 transform\u0103m aceste coloane \u00een factori:<\/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>\u00cen final, pentru a aplica specifica\u021bia creat\u0103 de noi la cadrul de date surs\u0103 <em>who<\/em> trebuie s\u0103 folosim argumentul <em>spec<\/em> \u00een func\u021bia <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>Tot ce am f\u0103cut acum poate fi schematic reprezentat astfel:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"The R package tidyr and its new functions pivot_longer and 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\">Specifica\u021bie cu utilizarea mai multor valori (.value)<\/h2>\n<p><\/p>\n<p>\u00cen exemplul de mai sus, coloana specifica\u021biei <em>.value<\/em> a avut doar o singur\u0103 valoare, de obicei a\u0219a este. <\/p>\n<p><\/p>\n<p>Dar uneori poate ap\u0103rea o situa\u021bie \u00een care trebuie s\u0103 aduna\u021bi valori din coloane cu tipuri de date diferite. Cu ajutorul unei func\u021bii \u00eenvechite, <code>spread()<\/code> ar fi destul de greu de realizat.<\/p>\n<p><\/p>\n<p>Exemplul de mai jos este preluat din <noindex><a rel=\"nofollow\" href=\"https:\/\/cran.r-project.org\/web\/packages\/data.table\/vignettes\/datatable-reshape.html\">viniete<\/a><\/noindex> pachetul <strong>data.table<\/strong>.<\/p>\n<p><\/p>\n<p>Hai s\u0103 cre\u0103m un cadru de date de antrenament.<\/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>Cadrele de date create con\u021bin \u00een fiecare r\u00e2nd informa\u021bii despre copiii unei familii. Familiile pot avea unul sau doi copii. Pentru fiecare copil, sunt furnizate informa\u021bii despre data na\u0219terii \u0219i sex, datele fiec\u0103rui copil fiind \u00een coloane separate. Sarcina noastr\u0103 este de a aduce aceste date \u00een formatul corect pentru analiz\u0103.<\/p>\n<p><\/p>\n<p>Observa\u021bi c\u0103 avem dou\u0103 variabile cu informa\u021bii despre fiecare copil: sexul \u0219i data na\u0219terii (coloanele cu prefixul <em>dop<\/em> con\u021bin data na\u0219terii, coloanele cu prefixul <em>gender<\/em> con\u021bin sexul copilului). \u00cen rezultatul a\u0219teptat, acestea ar trebui s\u0103 fie \u00een coloane separate. Putem realiza acest lucru gener\u00e2nd o specifica\u021bie \u00een care coloana <code>.value<\/code> va avea dou\u0103 valori diferite.<\/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>A\u0219adar, s\u0103 analiz\u0103m pas cu pas ac\u021biunile care sunt realizate prin codul de mai sus.<\/p>\n<p><\/p>\n<ul>\n<li><code>pivot_longer_spec(-family)<\/code> \u2014 cre\u0103m o specifica\u021bie care comprim\u0103 toate coloanele disponibile, except\u00e2nd coloana family.<\/li>\n<li><code>separate(col = name, into = c(\".value\", \"child\"))<\/code> \u2014 separ\u0103m coloana <em>.name<\/em>, care con\u021bine numele c\u00e2mpurilor surs\u0103, pe baza underscore-ului \u0219i introducem valorile ob\u021binute \u00een coloanele <em>.value<\/em> \u0219i <em>child<\/em>.<\/li>\n<li><code>mutate(child = parse_number(child))<\/code> \u2014 transform\u0103m valorile c\u00e2mpului <em>child<\/em> din tip text \u00een tip numeric.<\/li>\n<\/ul>\n<p><\/p>\n<p>Acum putem aplica specifica\u021bia ob\u021binut\u0103 cadrele de date ini\u021biale \u0219i s\u0103 aducem tabelul \u00een forma dorit\u0103.<\/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>Folosim argumentul <code>na.rm = TRUE<\/code>, deoarece forma actual\u0103 a datelor impune crearea de r\u00e2nduri suplimentare pentru observa\u021bii inexistente. Deoarece familia 2 are doar un singur copil, <code>na.rm = TRUE<\/code> garanteaz\u0103 c\u0103 familia 2 va avea un singur r\u00e2nd \u00een datele de ie\u0219ire.<\/p>\n<p><\/p>\n<h2 id=\"preobrazovanie-data-freymov-iz-dlinnogo-formata-k-shirokomu\">Transformarea data frame-urilor din format lung \u00een larg<\/h2>\n<p><\/p>\n<p><code>pivot_wider()<\/code> \u2014 reprezint\u0103 o transformare invers\u0103 \u0219i, invers, cre\u0219te num\u0103rul coloanelor din cadrul unui DataFrame prin reducerea num\u0103rului de r\u00e2nduri.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"The R package tidyr and its new functions pivot_longer and pivot_wider.\" src=\"\/wp-content\/uploads\/2020\/04\/b470664e06f362d6f0ea6df9c1ed426d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Un astfel de tip de transformare este folosit foarte rar pentru a aduce datele \u00eentr-o form\u0103 ordonat\u0103, totu\u0219i aceast\u0103 metod\u0103 poate fi util\u0103 pentru a crea tabele pivot folosite \u00een prezent\u0103ri sau pentru integrarea cu alte instrumente.<\/p>\n<p><\/p>\n<p>De fapt, func\u021biile <code>pivot_longer()<\/code> \u0219i <code>pivot_wider()<\/code> sunt simetrice \u0219i efectueaz\u0103 ac\u021biuni inverse una fa\u021b\u0103 de alta, adic\u0103: <code>df %&gt;% pivot_longer(spec = spec) %&gt;% pivot_wider(spec = spec)<\/code> \u0219i <code>df %&gt;% pivot_wider(spec = spec) %&gt;% pivot_longer(spec = spec)<\/code> va returna df-ul ini\u021bial.<\/p>\n<p><\/p>\n<h3 id=\"prosteyshiy-primer-privedeniya-tablicy-k-shirokomu-formatu\">Cel mai simplu exemplu de aducere a unei tabele \u00een format larg<\/h3>\n<p><\/p>\n<p>Pentru a demonstra func\u021bia <code>pivot_wider()<\/code> vom folosi setul de date <em>fish_encounters<\/em>, care con\u021bine informa\u021bii despre modul \u00een care diverse sta\u021bii urm\u0103resc mi\u0219carea pe\u0219tilor \u00een r\u00e2u.<\/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>\u00cen majoritatea cazurilor, aceast\u0103 tabel\u0103 va fi mai informativ\u0103 \u0219i mai u\u0219or de utilizat dac\u0103 prezent\u0103m informa\u021biile pentru fiecare sta\u021bie \u00eentr-o coloan\u0103 separat\u0103.<\/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;;               \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 cu 9 r\u00e2nduri mai mult \u0219i 1 variabil\u0103 \u00een plus: MAW<\/code><\/pre>\n<p><\/p>\n<p>Acest set de date \u00eenregistreaz\u0103 informa\u021bii doar \u00een acele cazuri c\u00e2nd pe\u0219tele a fost detectat de sta\u021bie, adic\u0103 dac\u0103 vreun pe\u0219te nu a fost observat de o anumit\u0103 sta\u021bie, atunci acele date nu vor fi \u00een tabel. Aceasta \u00eenseamn\u0103 c\u0103 rezultatul va fi completat cu NA. <\/p>\n<p><\/p>\n<p>Cu toate acestea, \u00een acest caz \u0219tim c\u0103 absen\u021ba unei \u00eenregistr\u0103ri \u00eenseamn\u0103 c\u0103 pe\u0219tele nu a fost observat, a\u0219a c\u0103 putem folosi argumentul <em>values_fill<\/em> \u00een func\u021bia <code>pivot_wider()<\/code> \u0219i putem completa aceste valori lips\u0103 cu zerouri:<\/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\">Generarea numelui coloanei din mai multe variabile de baz\u0103<\/h3>\n<p><\/p>\n<p>Imagina\u021bi-v\u0103 c\u0103 avem un tabel care con\u021bine combina\u021bii de produse, \u021b\u0103ri \u0219i ani. Pentru a genera un cadru de date de testare, pute\u021bi executa urm\u0103torul cod:<\/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>Sarcina noastr\u0103 este de a extinde cadrul de date astfel \u00eenc\u00e2t o coloan\u0103 s\u0103 con\u021bin\u0103 date pentru fiecare combina\u021bie de produs \u0219i \u021bar\u0103. Pentru aceasta, este suficient s\u0103 transmitem \u00een argumentul <em>names_from<\/em> un vector care con\u021bine denumirile c\u00e2mpurilor combinate.<\/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>De asemenea, pute\u021bi aplica specifica\u021bii func\u021biei <code>pivot_wider()<\/code>. Dar atunci c\u00e2nd este transmis \u00een <code>pivot_wider()<\/code> specifica\u021bia efectueaz\u0103 o transformare opus\u0103 <code>pivot_longer()<\/code>: se creeaz\u0103 coloanele specificate \u00een <em>.name<\/em>, utiliz\u00e2nd valorile din <em>.value<\/em> \u0219i alte coloane.<\/p>\n<p><\/p>\n<p>Pentru acest set de date, pute\u021bi genera o specifica\u021bie personalizat\u0103 dac\u0103 dori\u021bi ca fiecare combina\u021bie posibil\u0103 de \u021bar\u0103 \u0219i produs s\u0103 aib\u0103 propria coloan\u0103, nu doar cele care sunt prezente \u00een date:<\/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\">C\u00e2teva exemple avansate de lucru cu noua concep\u021bie 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\">Aducerea datelor \u00eentr-o form\u0103 ordonat\u0103 folosind un set de date despre recens\u0103m\u00e2ntul veniturilor \u0219i chiriei din SUA<\/h3>\n<p><\/p>\n<p>Setul de date <em>us_rent_income<\/em> con\u021bine informa\u021bii despre venitul mediu \u0219i chiria pentru fiecare stat din SUA \u00een 2017 (setul de date este disponibil \u00een pachetul <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    California income      29454   109\n#&gt; 10 06    California rent         1358     3\n#&gt; # \u2026 with 94 more rows<\/code><\/pre>\n<p><\/p>\n<p>\u00cen forma \u00een care sunt stocate datele \u00een setul de date, <em>us_rent_income<\/em> lucrul cu ele este extrem de inconvenient, a\u0219a c\u0103 am dori s\u0103 cre\u0103m un set de date cu coloanele: <em>rent<\/em>, <em>rent_moe<\/em>, <em>come<\/em>, <em>income_moe<\/em>. Exist\u0103 multe modalit\u0103\u021bi de a crea aceast\u0103 specifica\u021bie, dar esen\u021bial este c\u0103 trebuie s\u0103 gener\u0103m fiecare combina\u021bie de valori ale variabilei <em>estimate\/moe<\/em>, iar apoi s\u0103 gener\u0103m numele coloanei.<\/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>Furnizarea acestei specifica\u021bii <code>pivot_wider()<\/code> ne ofer\u0103 rezultatul pe care \u00eel c\u0103ut\u0103m:<\/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\">Banca Mondial\u0103<\/h3>\n<p><\/p>\n<p>Uneori, transformarea unui set de date \u00een forma dorit\u0103 necesit\u0103 mai mul\u021bi pa\u0219i.<br \/>\nSet de date <em>world_bank_pop<\/em> con\u021bine datele b\u0103ncii mondiale despre popula\u021bia fiec\u0103rei \u021b\u0103ri \u00een perioada 2000-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>Obiectivul nostru este s\u0103 cre\u0103m un set de date bine structurat, unde fiecare variabil\u0103 se afl\u0103 \u00eentr-o coloan\u0103 separat\u0103. Deocamdat\u0103 nu este clar ce pa\u0219i sunt necesari, dar vom \u00eencepe cu cea mai evident\u0103 problem\u0103: anul este distribuit pe mai multe coloane.<\/p>\n<p><\/p>\n<p>Pentru a corecta asta, este necesar s\u0103 folosim func\u021bia <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>Urm\u0103torul pas este s\u0103 ne concentr\u0103m asupra variabilei 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>Unde SP.POP.GROW reprezint\u0103 cre\u0219terea popula\u021biei, SP.POP.TOTL reprezint\u0103 num\u0103rul total al popula\u021biei, iar SP.URB. * reprezint\u0103 acela\u0219i lucru, dar doar pentru zona urban\u0103. S\u0103 \u00eemp\u0103r\u021bim aceste valori \u00een dou\u0103 variabile: area \u2014 teritoriu (total sau urban) \u0219i variabila care con\u021bine datele efective (population sau growth):<\/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>Acum ne r\u0103m\u00e2ne doar s\u0103 \u00eemp\u0103r\u021bim variabila variable \u00een dou\u0103 coloane:<\/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\">Lista de contacte<\/h3>\n<p><\/p>\n<p>Ultimul exemplu, imagina\u021bi-v\u0103 c\u0103 ave\u021bi o list\u0103 de contacte pe care a\u021bi copiat \u0219i lipit-o de pe 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>Transformarea acestei liste \u00eentr-un format tabular este destul de complicat\u0103, deoarece nu exist\u0103 o variabil\u0103 care s\u0103 identifice ce date apar\u021bin fiec\u0103rui contact. Putem corecta acest lucru observ\u00e2nd c\u0103 datele pentru fiecare nou contact \u00eencep cu numele (\"name\"), a\u0219a c\u0103 putem crea un identificator unic \u0219i s\u0103-l increment\u0103m cu unul de fiecare dat\u0103 c\u00e2nd \u00een coloana field apare valoarea \"name\":<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">contacts &lt;- contacts %&gt;% \n  mutate(\n    person_id = cumsum(field == \"name\")\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>Acum, c\u00e2nd avem un identificator unic pentru fiecare contact, putem transforma c\u00e2mpul \u0219i valoarea \u00een coloane:<\/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\">Concluzie<\/h2>\n<p><\/p>\n<p>Personal, consider c\u0103 noua conceptie <strong>tidyr<\/strong> este \u00eentr-adev\u0103r mai intuitiv\u0103 \u0219i dep\u0103\u0219e\u0219te semnificativ func\u021biile \u00eenvechite. <code>spread()<\/code> \u0219i <code>gather()<\/code>Sper c\u0103 acest articol v-a ajutat s\u0103 \u00een\u021belege\u021bi <code>pivot_longer()<\/code> \u0219i <code>pivot_wider()<\/code>.<\/p>\n<p>Sursa: <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.1 - 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\/ro\/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.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Pachetul R tidyr \u0219i noile sale func\u021bii pivot_longer \u0219i pivot_wider | ProHoster","description":"Pachetul tidyr face parte din nucleul uneia dintre cele mai populare biblioteci \u00een limbajul R \u2014 tidyverse. Scopul principal al pachetului este de a transforma datele \u00eentr-o form\u0103 organizat\u0103. Pe Habr.","canonical_url":"https:\/\/prohoster.info\/ro\/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":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/76291","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=76291"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/76291\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/76292"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=76291"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=76291"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=76291"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}