{"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\/sv\/blog\/administrirovanie\/r-paket-tidyr-i-ego-novye-funkczii-pivot_longer-i-pivot_wider","title":{"rendered":"R-paketet tidyr och dess nya funktioner pivot_longer och pivot_wider","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Paket <strong>tidyr<\/strong> ing\u00e5r i k\u00e4rnan av ett av de mest popul\u00e4ra biblioteken p\u00e5 spr\u00e5ket R \u2014 <strong>tidyverse<\/strong>.<br \/>\nHuvudsyftet med paketet \u00e4r att ge data ett ordnat utseende.<\/p>\n<p><\/p>\n<p>Det finns redan en artikel p\u00e5 Habr\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/248741\/\">publicering<\/a><\/noindex> dedikerad till detta paket, men den dateras till 2015. Jag vill ber\u00e4tta om de mest aktuella f\u00f6r\u00e4ndringarna som dess skapare Hadley Wickham meddelade f\u00f6r n\u00e5gra dagar sedan.<\/p>\n<p>\n<img decoding=\"async\" alt=\"R-paketet tidyr och dess nya funktioner pivot_longer och pivot_wider\" src=\"\/wp-content\/uploads\/2020\/04\/a290263b63aaea3db70e83a1ec411415.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<blockquote><p><b>SJK<\/b>: Kommer funktionerna gather() och spread() att betraktas som f\u00f6r\u00e5ldrade?<\/p>\n<p><b>Hadley Wickham<\/b>: I viss m\u00e5n. Vi kommer att sluta rekommendera anv\u00e4ndningen av dessa funktioner och r\u00e4tta till fel i dem, men de kommer fortfarande att finnas kvar i paketet i nuvarande tillst\u00e5nd.<\/p><\/blockquote>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"soderzhanie\">Inneh\u00e5ll<\/h2>\n<p><\/p>\n<p><em>Om du \u00e4r intresserad av dataanalys kan du vara intresserad av mina <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/R4marketing\">telegram<\/a><\/noindex> och <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/R4marketing\/?sub_confirmation=1\">YouTube<\/a><\/noindex> kanaler vara av intresse. St\u00f6rsta delen av inneh\u00e5llet \u00e4gnas \u00e5t spr\u00e5ket R.<\/em><\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"#koncepciya-tidydata\">Konceptet TidyData<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#osnovnye-funkcii-vhodyaschie-v-paket-tydir\">Huvudfunktionerna i paketet tidyr<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#novaya-koncepciya-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy-i-naoborot\">Ett nytt koncept f\u00f6r att omvandla data fr\u00e5n brett format till l\u00e5ngt och vice versa<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/ustnovka-naibolee-aktualnoy-versii-tidyr-0839000\">Installera den mest aktuella versionen av tidyr 0.8.3.9000<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#perehod-na-novye-funkcii\">\u00d6verg\u00e5ng till nya funktioner<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#prostoy-primer-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy\">Ett enkelt exempel p\u00e5 att omvandla data fr\u00e5n brett format till l\u00e5ngt<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#specifikacii\">Specifikationer<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#specifikaciya-s-ispolzovaniem-neskolkih-znacheniyvalue\">Specifikation med flera v\u00e4rden (.value)<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#preobrazovanie-data-freymov-iz-dlinnogo-formata-k-shirokomu\">Omvandla dataframes fr\u00e5n l\u00e5ngt format till brett<\/a><\/noindex>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"#prosteyshiy-primer-privedeniya-tablicy-k-shirokomu-formatu\">Det enklaste exemplet p\u00e5 att omvandla en tabell till brett format<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#generaciya-imeni-stolbca-iz-neskolkih-ishodnyh-peremennyh\">Generering av kolumnnamn fr\u00e5n flera ursprungliga variabler<\/a><\/noindex><\/li>\n<\/ul>\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#neskolko-prodvinutyh-primerov-raboty-s-novoy-koncepciey-tidyr\">Flera avancerade exempel p\u00e5 att arbeta med det nya konceptet 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\">Att ge data ett ordnat utseende, med hj\u00e4lp av ett dataset om inkomst och hyra i USA<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#vsemirnyy-bank\">V\u00e4rldsbanken<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#spisok-kontaktov\">Kontaklista<\/a><\/noindex><\/li>\n<\/ul>\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#zaklyuchenie\">Slutsats<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"koncepciya-tidydata\">Konceptet TidyData<\/h2>\n<p><\/p>\n<p>Syftet <strong>tidyr<\/strong> \u2014 hj\u00e4lpa dig att ge data ett s\u00e5 kallat ordnat utseende. Ordnade data \u00e4r data d\u00e4r: <\/p>\n<p><\/p>\n<ul>\n<li>Varje variabel finns i en kolumn. <\/li>\n<li>Varje observation \u00e4r en rad. <\/li>\n<li>Varje v\u00e4rde \u00e4r en cell.<\/li>\n<\/ul>\n<p><\/p>\n<p>Med data som har anpassats till tidy data \u00e4r det mycket enklare och bekv\u00e4mare att arbeta med under analys.<\/p>\n<p><\/p>\n<h2 id=\"osnovnye-funkcii-vhodyaschie-v-paket-tidyr\">Huvudfunktionerna i paketet tidyr<\/h2>\n<p><\/p>\n<p>tidyr inneh\u00e5ller ett set av funktioner avsedda f\u00f6r att transformera tabeller:<\/p>\n<p><\/p>\n<ul>\n<li><code>fill()<\/code> \u2014 fylla i saknade v\u00e4rden i en kolumn med f\u00f6reg\u00e5ende v\u00e4rden;<\/li>\n<li><code>separate()<\/code> \u2014 delar ett f\u00e4lt i flera med en avgr\u00e4nsare;<\/li>\n<li><code>unite()<\/code> \u2014 g\u00f6r en operation som f\u00f6renar flera f\u00e4lt till ett, motsatsen till funktionen <code>separate()<\/code>;<\/li>\n<li><code>pivot_longer()<\/code> \u2014 en funktion som omvandlar data fr\u00e5n brett format till l\u00e5ngt;<\/li>\n<li><code>pivot_wider()<\/code> \u2014 en funktion som omvandlar data fr\u00e5n l\u00e5ngt format till brett. Denna operation \u00e4r motsatsen till den som utf\u00f6rs av funktionen <code>pivot_longer()<\/code>.<\/li>\n<li><code>gather()<\/code><strong>f\u00f6r\u00e5ldrad<\/strong> \u2014 en funktion som omvandlar data fr\u00e5n brett format till l\u00e5ngt;<\/li>\n<li><code>spread()<\/code><strong>f\u00f6r\u00e5ldrad<\/strong> \u2014 en funktion som omvandlar data fr\u00e5n l\u00e5ngt format till brett. Denna operation \u00e4r motsatsen till den som utf\u00f6rs av funktionen <code>gather()<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"novaya-koncepciya-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy-i-naoborot\">Ett nytt koncept f\u00f6r att omvandla data fr\u00e5n brett format till l\u00e5ngt och vice versa<\/h2>\n<p><\/p>\n<p>Tidigare anv\u00e4nde man funktioner f\u00f6r liknande transformationer <code>gather()<\/code> och <code>spread()<\/code>. Med \u00e5ren har det blivit uppenbart att namnen p\u00e5 dessa funktioner och deras argument var otydliga f\u00f6r de flesta anv\u00e4ndare, inklusive paketets skapare, vilket ledde till sv\u00e5righeter att hitta och f\u00f6rst\u00e5 vilken av dessa funktioner som omvandlar en data ram fr\u00e5n brett till l\u00e5ngt format, och vice versa.<\/p>\n<p><\/p>\n<p>D\u00e4rf\u00f6r <strong>tidyr<\/strong> har tv\u00e5 nya, viktiga funktioner lagts till<\/p>\n<p><\/p>\n<p>De nya funktionerna <code>pivot_longer()<\/code> och <code>pivot_wider()<\/code> har skapats under intryck av vissa funktioner fr\u00e5n paketet <strong>cdata<\/strong>, skapad av John Mount och Nina Zumel.<\/p>\n<p><\/p>\n<h3 id=\"ustanovka-naibolee-aktualnoy-versii-tidyr-0839000\">Installera den mest aktuella versionen av tidyr 0.8.3.9000<\/h3>\n<p><\/p>\n<p>F\u00f6r att installera den senaste versionen av paketet <strong>tidyr<\/strong> <em>0.8.3.9000<\/em>, d\u00e4r de nya funktionerna \u00e4r tillg\u00e4ngliga, anv\u00e4nd f\u00f6ljande kod.<\/p>\n<p><\/p>\n<p><code>devtools::install_github(&quot;tidyverse\/tidyr&quot;)<\/code><\/p>\n<p><\/p>\n<p>Vid tidpunkten f\u00f6r artikelskrivandet \u00e4r dessa funktioner endast tillg\u00e4ngliga i dev-versionen av paketet p\u00e5 GitHub.<\/p>\n<p><\/p>\n<h3 id=\"perehod-na-novye-funkcii\">\u00d6verg\u00e5ng till nya funktioner<\/h3>\n<p><\/p>\n<p>Att faktiskt \u00f6vers\u00e4tta gamla skript till att anv\u00e4nda de nya funktionerna \u00e4r inte sv\u00e5rt; f\u00f6r att f\u00f6rst\u00e5 b\u00e4ttre tar jag ett exempel fr\u00e5n dokumentationen av de gamla funktionerna och visar hur dessa operationer utf\u00f6rs med hj\u00e4lp av de nya <code>pivot_*()<\/code> funktionerna.<\/p>\n<p><\/p>\n<p>Omvandling fr\u00e5n brett format till l\u00e5ngt.<\/p>\n<p>\n<b class=\"spoiler_title\">Kodexempel fr\u00e5n dokumentationen f\u00f6r funktionen 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>Omvandling fr\u00e5n l\u00e5ngt format till brett.<\/p>\n<p>\n<b class=\"spoiler_title\">Kodexempel fr\u00e5n dokumentationen f\u00f6r funktionen 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>Eftersom i de ovan n\u00e4mnda exemplen med <code>pivot_longer()<\/code> och <code>pivot_wider()<\/code>, i den ursprungliga tabellen <em>stocks<\/em> finns det inga kolumner som n\u00e4mns i argumenten <em>names_to<\/em> och <em>values_to<\/em> m\u00e5ste deras namn anges inom citationstecken.<\/p>\n<p><\/p>\n<p>Tabellen som hj\u00e4lper dig att enklast f\u00f6rst\u00e5 hur man g\u00e5r \u00f6ver till att arbeta med det nya konceptet <strong>tidyr<\/strong>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"R-paketet tidyr och dess nya funktioner pivot_longer och 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\">Anteckning fr\u00e5n f\u00f6rfattaren<\/h2>\n<p><\/p>\n<blockquote><p>All vidare text \u00e4r en anpassad, jag skulle till och med s\u00e4ga fri \u00f6vers\u00e4ttning av <noindex><a rel=\"nofollow\" href=\"https:\/\/tidyr.tidyverse.org\/dev\/articles\/pivot.html\">vignetterna<\/a><\/noindex> fr\u00e5n den officiella webbplatsen f\u00f6r biblioteket tidyverse.<\/p><\/blockquote>\n<p><\/p>\n<h2 id=\"prostoy-primer-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy\">Ett enkelt exempel p\u00e5 att omvandla data fr\u00e5n brett format till l\u00e5ngt<\/h2>\n<p><\/p>\n<p><code>pivot_longer ()<\/code> g\u00f6r datam\u00e4ngder l\u00e4ngre, minskar antalet kolumner och \u00f6kar antalet rader.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"R-paketet tidyr och dess nya funktioner pivot_longer och pivot_wider\" src=\"\/wp-content\/uploads\/2020\/04\/fc88b99f2fecdcdaa6179d2e7d29e59d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>F\u00f6r att utf\u00f6ra exemplen i artikeln m\u00e5ste de n\u00f6dv\u00e4ndiga paketen initially laddas:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">library(tidyr)\nlibrary(dplyr)\nlibrary(readr)<\/code><\/pre>\n<p><\/p>\n<p>Anta att vi har en tabell med resultaten fr\u00e5n en unders\u00f6kning d\u00e4r (bland annat) m\u00e4nniskor tillfr\u00e5gades om sin religion och sin \u00e5rliga inkomst:<\/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>Den h\u00e4r tabellen inneh\u00e5ller data om respondenternas religioner i raderna, medan inkomstniv\u00e5n sprids \u00f6ver kolumnnamnen. Antalet respondenter fr\u00e5n varje kategori lagras i v\u00e4rdena i cellerna vid sk\u00e4rningspunkten mellan religion och inkomstniv\u00e5. F\u00f6r att f\u00e5 tabellen i ett snyggt, korrekt format r\u00e4cker det att anv\u00e4nda <code>pivot_longer()<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">pew %&gt;% \n  pivot_longer(cols = -religion, names_to = &quot;income&quot;, values_to = &quot;count&quot;)<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">pew %&gt;% \n  pivot_longer(cols = -religion, names_to = &quot;income&quot;, values_to = &quot;count&quot;)\n#&gt; # A tibble: 180 x 3\n#&gt;    religion income             count\n#&gt;    &lt;chr&gt;    &lt;chr&gt;              &lt;dbl&gt;\n#&gt;  1 Agnostic &lt;$10k                 27\n#&gt;  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>Argumenten f\u00f6r funktionen <code>pivot_longer()<\/code><\/p>\n<p><\/p>\n<ul>\n<li>Det f\u00f6rsta argumentet <em>cols<\/em>, beskriver vilka kolumner som ska sl\u00e5s samman. I detta fall alla kolumner f\u00f6rutom <em>time<\/em>.<\/li>\n<li>Argumentet <em>names_to<\/em> namnger variabeln som kommer att skapas fr\u00e5n kolumnnamnen vi har slagit samman.<\/li>\n<li><em>values_to<\/em> namnger variabeln som kommer att skapas fr\u00e5n de v\u00e4rden som finns i cellerna i de sammanfogade kolumnerna.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"specifikacii\">Specifikationer<\/h2>\n<p><\/p>\n<p>Detta \u00e4r en ny funktionalitet i paketet <strong>tidyr<\/strong>, som tidigare var otillg\u00e4nglig n\u00e4r man anv\u00e4nde de f\u00f6r\u00e5ldrade funktionerna.<\/p>\n<p><\/p>\n<p>Specifikation \u00e4r ett dataram, d\u00e4r varje rad motsvarar en kolumn i den nya utdata-dataramen och tv\u00e5 specialkolumner som b\u00f6rjar med: <\/p>\n<p><\/p>\n<ul>\n<li><em>.*.namn<\/em> inneh\u00e5ller det ursprungliga kolumnnamnet. <\/li>\n<li><em>.value<\/em> inneh\u00e5ller namnet p\u00e5 kolumnen som v\u00e4rdena i cellerna kommer att g\u00e5 in i. <\/li>\n<\/ul>\n<p><\/p>\n<p>De \u00f6vriga kolumnerna i specifikationen \u00e5terspeglar hur titeln p\u00e5 de komprimerade kolumnerna kommer att presenteras i den nya kolumnen. <em>.*.namn<\/em>.<\/p>\n<p><\/p>\n<p>Specifikationen beskriver metadata lagrad i kolumnnamnet, med en rad f\u00f6r varje kolumn och en kolumn f\u00f6r varje variabel som har sammanfogats med kolumnnamnet. Just nu kanske den definitionen verkar f\u00f6rvirrande, men efter att ha granskat ett par exempel kommer det bli mycket tydligare.<\/p>\n<p><\/p>\n<p>Syftet med specifikationen \u00e4r att du kan extrahera, \u00e4ndra och s\u00e4tta nya metadata till den transformerade dataram.<\/p>\n<p><\/p>\n<p>F\u00f6r att arbeta med specifikationerna vid omvandlingen av en tabell fr\u00e5n brett format till l\u00e5ngt format anv\u00e4nds funktionen <code>pivot_longer_spec()<\/code>.<\/p>\n<p><\/p>\n<p>Hur denna funktion fungerar \u00e4r att den tar vilken dataram som helst och formar dess metadata p\u00e5 det s\u00e4tt som beskrivits ovan. <\/p>\n<p><\/p>\n<p>F\u00f6r att ge ett exempel kan vi ta datasetet who, som tillhandah\u00e5lls med paketet <strong>tidyr<\/strong>. Denna dataset inneh\u00e5ller information fr\u00e5n V\u00e4rldsh\u00e4lsoorganisationen om tuberkulosfall.<\/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;                        \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 med 7,230 fler rader och 53 fler variabler<\/code><\/pre>\n<p><\/p>\n<p>Vi bygger dess specifikation.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec &lt;- who %&gt;%\n  pivot_longer_spec(new_sp_m014:newrel_f65, values_to = &quot;count&quot;)<\/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>F\u00e4lt <em>land<\/em>, <em>iso2<\/em>, <em>iso3<\/em> \u00e4r redan variabler. V\u00e5r uppgift \u00e4r att v\u00e4nda kolumnerna med <em>new_sp_m014<\/em> per <em>newrel_f65<\/em>.<\/p>\n<p><\/p>\n<p>I namnen p\u00e5 dessa kolumner lagras f\u00f6ljande information:<\/p>\n<p><\/p>\n<ul>\n<li>Prefix <code>new_<\/code> indikerar att kolumnen inneh\u00e5ller data om nya tuberkulosfall; den aktuella dataframen inneh\u00e5ller information endast om nya fall, s\u00e5 detta prefix har ingen meningsfull betydelse i nuvarande sammanhang.<\/li>\n<li><code>sp<\/code>\/<code>rel<\/code>\/<code>sp<\/code>\/<code>ep<\/code> beskriver diagnosmetoden.<\/li>\n<li><code>m<\/code>\/<code>f<\/code> patientens k\u00f6n.<\/li>\n<li><code>014<\/code>\/<code>1524<\/code>\/<code>2535<\/code>\/<code>3544<\/code>\/<code>4554<\/code>\/<code>65<\/code> patientens \u00e5ldersintervall.<\/li>\n<\/ul>\n<p><\/p>\n<p>Vi kan dela dessa kolumner med funktionen <code>extract()<\/code>, med hj\u00e4lp av regulj\u00e4ra uttryck.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec &lt;- spec %&gt;%\n        extract(name, c(&quot;diagnosis&quot;, &quot;gender&quot;, &quot;age&quot;), &quot;new_?(.*)_(.)(.*)&quot;)<\/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>Observera att kolumnen <em>.*.namn<\/em> ska f\u00f6rbli of\u00f6r\u00e4ndrad, eftersom det \u00e4r v\u00e5r index i kolumnnamnen i den ursprungliga datasetet. <\/p>\n<p><\/p>\n<p>K\u00f6n och \u00e5lder (kolumnerna <em>gender<\/em> och <em>age<\/em>) har fasta och k\u00e4nda v\u00e4rden, s\u00e5 det rekommenderas att omvandla dessa kolumner till faktorer:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec &lt;-  spec %&gt;%\n            mutate(\n              gender = factor(gender, levels = c(&quot;f&quot;, &quot;m&quot;)),\n              age = factor(age, levels = unique(age), ordered = TRUE)\n            ) <\/code><\/pre>\n<p><\/p>\n<p>Slutligen, f\u00f6r att till\u00e4mpa den specifikation vi har skapat p\u00e5 den ursprungliga dataframen <em>who<\/em> m\u00e5ste vi anv\u00e4nda argumentet <em>spec<\/em> i funktionen <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>Allt vi just gjort kan schematiskt representeras s\u00e5 h\u00e4r:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"R-paketet tidyr och dess nya funktioner pivot_longer och 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\">Specifikation med flera v\u00e4rden (.value)<\/h2>\n<p><\/p>\n<p>I det ovanst\u00e5ende exemplet representeras specifikationskolumnen <em>.value<\/em> inneh\u00f6ll bara ett v\u00e4rde, vilket oftast \u00e4r fallet. <\/p>\n<p><\/p>\n<p>Men ibland kan det uppst\u00e5 en situation d\u00e4r du beh\u00f6ver samla in data fr\u00e5n kolumner med olika datatyper. Med hj\u00e4lp av den f\u00f6r\u00e5ldrade funktionen <code>spread()<\/code> skulle det vara ganska sv\u00e5rt att g\u00f6ra.<\/p>\n<p><\/p>\n<p>Exemplet nedan \u00e4r h\u00e4mtat fr\u00e5n <noindex><a rel=\"nofollow\" href=\"https:\/\/cran.r-project.org\/web\/packages\/data.table\/vignettes\/datatable-reshape.html\">vignetterna<\/a><\/noindex> paketet <strong>data.table<\/strong>.<\/p>\n<p><\/p>\n<p>L\u00e5t oss skapa en tr\u00e4ningsdataframe.<\/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 &lt;- family %&gt;% mutate_at(vars(starts_with(&quot;dob&quot;)), 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>Den skapade dataframet inneh\u00e5ller p\u00e5 varje rad uppgifter om barnen i en familj. Familjer kan ha ett eller tv\u00e5 barn. F\u00f6r varje barn tillhandah\u00e5lls data om f\u00f6delsedatum och k\u00f6n, d\u00e4r uppgifterna f\u00f6r varje barn kommer i separata kolumner. V\u00e5r uppgift \u00e4r att f\u00e5 dessa data i r\u00e4tt format f\u00f6r analys.<\/p>\n<p><\/p>\n<p>Observera att vi har tv\u00e5 variabler med information om varje barn: deras k\u00f6n och f\u00f6delsedatum (kolumner med prefixet <em>dob<\/em> inneh\u00e5ller f\u00f6delsedatum, kolumner med prefixet <em>gender<\/em> inneh\u00e5ller barnets k\u00f6n). I det f\u00f6rv\u00e4ntade resultatet ska de komma i separata kolumner. Vi kan g\u00f6ra detta genom att generera en specifikation d\u00e4r kolumnen <code>.value<\/code> kommer att ha tv\u00e5 olika v\u00e4rden.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec &lt;- family %&gt;%\n  pivot_longer_spec(-family) %&gt;%\n  separate(col = name, into = c(&quot;.value&quot;, &quot;child&quot;))%&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>S\u00e5 l\u00e5t oss g\u00e5 igenom stegen som utf\u00f6rs av ovanst\u00e5ende kod.<\/p>\n<p><\/p>\n<ul>\n<li><code>pivot_longer_spec(-family)<\/code> \u2014 vi skapar en specifikation som komprimerar alla existerande kolumner f\u00f6rutom kolumnen family.<\/li>\n<li><code>separate(col = name, into = c(&quot;.value&quot;, &quot;child&quot;))<\/code> \u2014 vi separerar kolumnen <em>.*.namn<\/em>, som inneh\u00e5ller namnen p\u00e5 de ursprungliga f\u00e4lten, baserat p\u00e5 understreck och placerar de erh\u00e5llna v\u00e4rdena i kolumnerna <em>.value<\/em> och <em>child<\/em>.<\/li>\n<li><code>mutate(child = parse_number(child))<\/code> \u2014 vi omvandlar v\u00e4rdena i f\u00e4ltet <em>child<\/em> fr\u00e5n textuell till numerisk datatyp.<\/li>\n<\/ul>\n<p><\/p>\n<p>Nu kan vi applicera den erh\u00e5llna specifikationen p\u00e5 den ursprungliga dataframen f\u00f6r att f\u00e5 tabellen i \u00f6nskat format.<\/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>Vi anv\u00e4nder argumentet <code>na.rm = TRUE<\/code>, eftersom den nuvarande datan tvingar oss att skapa \u00f6verfl\u00f6diga rader f\u00f6r saknade observationer. Eftersom familj 2 har endast ett barn, <code>na.rm = TRUE<\/code> garanterar att familj 2 kommer att ha en rad i utdata.<\/p>\n<p><\/p>\n<h2 id=\"preobrazovanie-data-freymov-iz-dlinnogo-formata-k-shirokomu\">Omvandla dataframes fr\u00e5n l\u00e5ngt format till brett<\/h2>\n<p><\/p>\n<p><code>pivot_wider()<\/code> \u2013 \u00e4r en omv\u00e4nd transformation och \u00f6kar antalet kolumner i dataframen genom att minska antalet rader.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"R-paketet tidyr och dess nya funktioner pivot_longer och pivot_wider\" src=\"\/wp-content\/uploads\/2020\/04\/b470664e06f362d6f0ea6df9c1ed426d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Denna typ av transformation anv\u00e4nds s\u00e4llan f\u00f6r att strukturera data, men detta tillv\u00e4gag\u00e5ngss\u00e4tt kan vara anv\u00e4ndbart f\u00f6r att skapa sammanfattningstabeller som anv\u00e4nds i presentationer, eller f\u00f6r integration med andra verktyg.<\/p>\n<p><\/p>\n<p>I sj\u00e4lva verket \u00e4r funktionerna <code>pivot_longer()<\/code> och <code>pivot_wider()<\/code> symmetriska och utf\u00f6r motsatta \u00e5tg\u00e4rder, dvs: <code>df %&gt;% pivot_longer(spec = spec) %&gt;% pivot_wider(spec = spec)<\/code> och <code>df %&gt;% pivot_wider(spec = spec) %&gt;% pivot_longer(spec = spec)<\/code> \u00e5terst\u00e4ller den ursprungliga df.<\/p>\n<p><\/p>\n<h3 id=\"prosteyshiy-primer-privedeniya-tablicy-k-shirokomu-formatu\">Det enklaste exemplet p\u00e5 att omvandla en tabell till brett format<\/h3>\n<p><\/p>\n<p>F\u00f6r att demonstrera funktionen <code>pivot_wider()<\/code> kommer vi att anv\u00e4nda datasetet <em>fish_encounters<\/em>, som inneh\u00e5ller information om hur olika stationer registrerar fiskars r\u00f6relser i floden.<\/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>I de flesta fall kommer denna tabell att vara mer informativ och anv\u00e4ndbar om informationen presenteras per station i separata kolumner.<\/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; # En tibble: 19 x 12\n#&gt;    fisk  Frigivning I80_1 Lissabon  Rstr Bas_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 med 9 fler rader och 1 fler variabel: MAW<\/code><\/pre>\n<p><\/p>\n<p>Detta dataset registrerar information endast i de fall d\u00e4r fisken har uppt\u00e4ckts av stationen, dvs. om n\u00e5gon fisk inte har registrerats av n\u00e5gon station, s\u00e5 kommer denna data inte att finnas i tabellen. Detta inneb\u00e4r att utdata kommer att fyllas med NA. <\/p>\n<p><\/p>\n<p>Men i detta fall vet vi att fr\u00e5nvaron av en post betyder att fisken inte har setts, s\u00e5 vi kan anv\u00e4nda argumentet <em>values_fill<\/em> i funktionen <code>pivot_wider()<\/code> och fylla dessa saknade v\u00e4rden med nollor:<\/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\">Generering av kolumnnamn fr\u00e5n flera ursprungliga variabler<\/h3>\n<p><\/p>\n<p>T\u00e4nk dig att vi har en tabell som inneh\u00e5ller en kombination av produkter, l\u00e4nder och \u00e5r. F\u00f6r att generera ett testdataframe kan vi k\u00f6ra f\u00f6ljande kod:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">df &lt;- expand_grid(\n  product = c(&quot;A&quot;, &quot;B&quot;), \n  country = c(&quot;AI&quot;, &quot;EI&quot;), \n  year = 2000:2014\n) %&gt;%\n  filter((product == &quot;A&quot; &amp; country == &quot;AI&quot;) | product == &quot;B&quot;) %&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>V\u00e5r uppgift \u00e4r att utvidga dataframe s\u00e5 att en kolumn inneh\u00e5ller data f\u00f6r varje kombination av produkt och land. F\u00f6r detta r\u00e4cker det med att ange i argumentet <em>names_from<\/em> en vektor som inneh\u00e5ller namnen p\u00e5 de sammanfogade f\u00e4lten.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">df %&gt;% pivot_wider(names_from = c(product, country),\n                 values_from = &quot;value&quot;)<\/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>Du kan ocks\u00e5 till\u00e4mpa specifikationer p\u00e5 funktionen <code>pivot_wider()<\/code>. Men n\u00e4r den skickas till <code>pivot_wider()<\/code> specifikationen utf\u00f6r en omvandling som \u00e4r motsatt <code>pivot_longer()<\/code>: kolumner skapas enligt dem som anges i <em>.*.namn<\/em>, med v\u00e4rden fr\u00e5n <em>.value<\/em> och andra kolumner.<\/p>\n<p><\/p>\n<p>F\u00f6r denna datam\u00e4ngd kan du generera en anpassad specifikation om du vill att varje m\u00f6jlig kombination av land och produkt ska ha sin egen kolumn, inte bara de som finns i data:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec &lt;- df %&gt;% \n  expand(product, country, .value = &quot;value&quot;) %&gt;% \n  unite(&quot;.name&quot;, 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\">Flera avancerade exempel p\u00e5 att arbeta med det nya konceptet 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\">Att ge data ett ordnat utseende, med hj\u00e4lp av ett dataset om inkomst och hyra i USA<\/h3>\n<p><\/p>\n<p>Datam\u00e4ngden <em>us_rent_income<\/em> inneh\u00e5ller information om genomsnittsinkomst och hyra f\u00f6r varje delstat i USA f\u00f6r 2017 (datam\u00e4ngden finns tillg\u00e4nglig i paketet <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 med 94 fler rader<\/code><\/pre>\n<p><\/p>\n<p>I den form som data lagras i datasetet <em>us_rent_income<\/em> \u00e4r det mycket opraktiskt att arbeta med dem, s\u00e5 vi skulle vilja skapa en datam\u00e4ngd med kolumner: <em>rent<\/em>, <em>rent_moe<\/em>, <em>come<\/em>, <em>income_moe<\/em>. Det finns m\u00e5nga s\u00e4tt att skapa denna specifikation, men det viktiga \u00e4r att vi beh\u00f6ver generera varje kombination av v\u00e4rden f\u00f6r variabeln och <em>estimate\/moe<\/em>, och d\u00e4refter generera namnet p\u00e5 kolumnen.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">  spec &lt;- us_rent_income %&gt;% \n    expand(variable, .value = c(&quot;estimate&quot;, &quot;moe&quot;)) %&gt;% \n    mutate(\n      .name = paste0(variable, ifelse(.value == &quot;moe&quot;, &quot;_moe&quot;, &quot;&quot;))\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>Att tillhandah\u00e5lla denna specifikation <code>pivot_wider()<\/code> ger oss det resultat vi s\u00f6ker:<\/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\">V\u00e4rldsbanken<\/h3>\n<p><\/p>\n<p>Ibland kr\u00e4ver det flera steg att f\u00e5 en datam\u00e4ngd i r\u00e4tt form.<br \/>\nDatam\u00e4ngd <em>world_bank_pop<\/em> inneh\u00e5ller data fr\u00e5n v\u00e4rldsbanksbefolkningen f\u00f6r varje land under perioden 2000 till 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>V\u00e5rt m\u00e5l \u00e4r att skapa en ren datam\u00e4ngd d\u00e4r varje variabel finns i en separat kolumn. Det \u00e4r fortfarande oklart vilka steg som beh\u00f6vs, men vi b\u00f6rjar med det mest uppenbara problemet: \u00e5ret \u00e4r uppdelat i flera kolumner.<\/p>\n<p><\/p>\n<p>F\u00f6r att \u00e5tg\u00e4rda detta beh\u00f6ver vi anv\u00e4nda funktionen <code>pivot_longer()<\/code>.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">pop2 &lt;- world_bank_pop %&gt;% \n  pivot_longer(`2000`:`2017`, names_to = &quot;year&quot;)<\/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>N\u00e4sta steg \u00e4r att \u00f6verv\u00e4ga variabeln 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>D\u00e4r SP.POP.GROW \u00e4r befolkningstillv\u00e4xt, SP.POP.TOTL \u00e4r den totala befolkningen, och SP.URB. * \u00e4r detsamma men enbart f\u00f6r stadsomr\u00e5den. L\u00e5t oss dela upp dessa v\u00e4rden i tv\u00e5 variabler: area \u2014 omr\u00e5de (total eller urban) och en variabel som inneh\u00e5ller faktiska data (population eller growth):<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">pop3 &lt;- pop2 %&gt;% \n  separate(indicator, c(NA, &quot;area&quot;, &quot;variable&quot;))<\/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>Nu \u00e5terst\u00e5r det bara att dela variabeln variable i tv\u00e5 kolumner:<\/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\">Kontaklista<\/h3>\n<p><\/p>\n<p>Det sista exemplet, f\u00f6rest\u00e4ll dig att du har en kontaktlista som du har kopierat och klistrat in fr\u00e5n en webbplats:<\/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>\u041f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u044d\u0442\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043a \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u043c\u0443 \u0432\u0438\u0434\u0443 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043b\u0430, \u043a\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442 \u043a\u0430\u043a\u043e\u043c\u0443 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u0443. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e, \u0437\u0430\u043c\u0435\u0442\u0438\u0432, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043d\u043e\u0432\u043e\u043c\u0443 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u0443 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0441 \u0438\u043c\u0435\u043d\u0438 (&quot;name&quot;), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440, \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435 field \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u201cname\u201d:<\/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>Nu n\u00e4r vi har en unik identifierare f\u00f6r varje kontakt kan vi v\u00e4nda f\u00e4lt och v\u00e4rde till kolumner:<\/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\">Slutsats<\/h2>\n<p><\/p>\n<p>Enligt min \u00e5sikt \u00e4r den nya konceptet <strong>tidyr<\/strong> verkligen mer intuitivt och betydligt \u00f6verl\u00e4gset de f\u00f6r\u00e5ldrade funktionerna. <code>spread()<\/code> och <code>gather()<\/code>Hoppas att den h\u00e4r artikeln har hj\u00e4lpt dig att f\u00f6rst\u00e5. <code>pivot_longer()<\/code> och <code>pivot_wider()<\/code>.<\/p>\n<p>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/r-paket-tidyr-i-ego-novye-funkczii-pivot_longer-i-pivot_wider\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47R-paketet tidyr och dess nya funktioner pivot_longer och pivot_wider | ProHoster","description":"Paketet tidyr ing\u00e5r i k\u00e4rnan av ett av de mest popul\u00e4ra biblioteken p\u00e5 R-spr\u00e5ket \u2014 tidyverse. Huvudsyftet med paketet \u00e4r att strukturera data p\u00e5 ett snyggt s\u00e4tt. P\u00e5 Habr\u00e9.","canonical_url":"https:\/\/prohoster.info\/sv\/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":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/76291","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=76291"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/76291\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/76292"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=76291"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=76291"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=76291"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}