{"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\/da\/blog\/administrirovanie\/r-paket-tidyr-i-ego-novye-funkczii-pivot_longer-i-pivot_wider","title":{"rendered":"R-pakken tidyr og dets nye funktioner pivot_longer og pivot_wider","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Pakken <strong>tidyr<\/strong> er en del af kernen i et af de mest popul\u00e6re biblioteker p\u00e5 R-sproget \u2014 <strong>tidyverse<\/strong>.<br \/>\nHovedform\u00e5let med pakken er at bringe data i et p\u00e6nt format.<\/p>\n<p><\/p>\n<p>Der findes allerede en artikel p\u00e5 Habr, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/248741\/\">publikation<\/a><\/noindex> dedikeret til denne pakke, men den er dateret til 2015. Jeg vil gerne tale om de mest aktuelle \u00e6ndringer, som dens forfatter Hadley Wickham netop har annonceret.<\/p>\n<p>\n<img decoding=\"async\" alt=\"R-pakken tidyr og dets nye funktioner pivot_longer og pivot_wider\" src=\"\/wp-content\/uploads\/2020\/04\/a290263b63aaea3db70e83a1ec411415.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<blockquote><p><b>SJK<\/b>: Vil funktionerne gather() og spread() blive for\u00e6ldede?<\/p>\n<p><b>Hadley Wickham<\/b>: I en vis grad. Vi vil stoppe med at anbefale brugen af disse funktioner og rette fejl i dem, men de vil fortsat v\u00e6re til stede i pakken i deres nuv\u00e6rende form.<\/p><\/blockquote>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"soderzhanie\">Indhold<\/h2>\n<p><\/p>\n<p><em>Hvis du er interesseret i dataanalyse, kan mine <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/R4marketing\">telegram<\/a><\/noindex> og <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/R4marketing\/?sub_confirmation=1\">youtube<\/a><\/noindex> kanaler v\u00e6re interessante for dig. St\u00f8rstedelen af indholdet er dedikeret til R-sproget.<\/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\">Hovedfunktionerne i tidyr-pakken<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#novaya-koncepciya-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy-i-naoborot\">Den nye koncept for transformation af data fra bredt format til langt og omvendt<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/ustnovka-naibolee-aktualnoy-versii-tidyr-0839000\">Installation af den mest aktuelle version af tidyr 0.8.3.9000<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#perehod-na-novye-funkcii\">Overgang til de nye funktioner<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#prostoy-primer-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy\">Et enkelt eksempel p\u00e5 transformation af data fra bredt format til langt<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#specifikacii\">Specificationer<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#specifikaciya-s-ispolzovaniem-neskolkih-znacheniyvalue\">Specifikation med brug af flere v\u00e6rdier (.value)<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#preobrazovanie-data-freymov-iz-dlinnogo-formata-k-shirokomu\">Transformation af dataframes fra langt format til bredt<\/a><\/noindex>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"#prosteyshiy-primer-privedeniya-tablicy-k-shirokomu-formatu\">Det enkleste eksempel p\u00e5 at bringe en tabel til bredt format<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#generaciya-imeni-stolbca-iz-neskolkih-ishodnyh-peremennyh\">Generering af kolonnenavn ud fra flere oprindelige variabler<\/a><\/noindex><\/li>\n<\/ul>\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#neskolko-prodvinutyh-primerov-raboty-s-novoy-koncepciey-tidyr\">Flere avancerede eksempler p\u00e5 arbejde med det nye tidyr-koncept<\/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\">Bringing data into a tidy format med eksemplet p\u00e5 datas\u00e6t om indkomst og husleje i USA<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#vsemirnyy-bank\">Verdensbanken<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#spisok-kontaktov\">Kontaktliste<\/a><\/noindex><\/li>\n<\/ul>\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#zaklyuchenie\">Konklusion<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"koncepciya-tidydata\">Konceptet TidyData<\/h2>\n<p><\/p>\n<p>Form\u00e5let <strong>tidyr<\/strong> \u2014 at hj\u00e6lpe dig med at bringe data i s\u00e5kaldt p\u00e6nt format. P\u00e6ne data er data, hvor: <\/p>\n<p><\/p>\n<ul>\n<li>Hver variabel er i en s\u00f8jle. <\/li>\n<li>Hver observation er en r\u00e6kke. <\/li>\n<li>Hver v\u00e6rdi er en celle.<\/li>\n<\/ul>\n<p><\/p>\n<p>Data, der er bragt til tidy data, er betydeligt nemmere at arbejde med under analysem\u00e5ling.<\/p>\n<p><\/p>\n<h2 id=\"osnovnye-funkcii-vhodyaschie-v-paket-tidyr\">Hovedfunktionerne i tidyr-pakken<\/h2>\n<p><\/p>\n<p>tidyr indeholder et s\u00e6t funktioner beregnet til at transformere tabeller:<\/p>\n<p><\/p>\n<ul>\n<li><code>fill()<\/code> \u2014 fylder manglende v\u00e6rdier i en s\u00f8jle med de foreg\u00e5ende v\u00e6rdier;<\/li>\n<li><code>separate()<\/code> \u2014 opdeler et felt i flere via en separator;<\/li>\n<li><code>unite()<\/code> \u2014 udf\u00f8rer en operation om at samle flere felter til \u00e9t, svarende til funktionen <code>separate()<\/code>;<\/li>\n<li><code>pivot_longer()<\/code> \u2014 funktionen der omdanner data fra bredt format til langt;<\/li>\n<li><code>pivot_wider()<\/code> \u2014 funktionen der omdanner data fra langt format til bredt. Operationen er den omvendte af den, der udf\u00f8res af funktionen <code>pivot_longer()<\/code>.<\/li>\n<li><code>gather()<\/code><strong>for\u00e6ldet<\/strong> \u2014 funktionen der omdanner data fra bredt format til langt;<\/li>\n<li><code>spread()<\/code><strong>for\u00e6ldet<\/strong> \u2014 funktionen der omdanner data fra langt format til bredt. Operationen er den omvendte af den, der udf\u00f8res af funktionen <code>gather()<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"novaya-koncepciya-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy-i-naoborot\">Den nye koncept for transformation af data fra bredt format til langt og omvendt<\/h2>\n<p><\/p>\n<p>Tidligere blev funktioner brugt til denne slags transformationer <code>gather()<\/code> og <code>spread()<\/code>. Gennem \u00e5rene er det blevet tydeligt, at for de fleste brugere, inklusive pakken forfatter, var navnene p\u00e5 disse funktioner og deres argumenter ikke s\u00e6rlig intuitive og for\u00e5rsagede vanskeligheder ved at finde og forst\u00e5, hvilken af disse funktioner der omdanner en data ramme fra bred til lang format og omvendt.<\/p>\n<p><\/p>\n<p>Af denne grund er der <strong>tidyr<\/strong> tilf\u00f8jet to nye, vigtige funktioner, der er designet til at transformere data rammer.<\/p>\n<p><\/p>\n<p>De nye funktioner <code>pivot_longer()<\/code> og <code>pivot_wider()<\/code> er inspireret af nogle funktioner fra pakken <strong>cdata<\/strong>, skabt af John Mount og Nina Zumel.<\/p>\n<p><\/p>\n<h3 id=\"ustanovka-naibolee-aktualnoy-versii-tidyr-0839000\">Installation af den mest aktuelle version af tidyr 0.8.3.9000<\/h3>\n<p><\/p>\n<p>For at installere den nyeste, mest aktuelle version af pakken <strong>tidyr<\/strong> <em>0.8.3.9000<\/em>, hvor de nye funktioner er tilg\u00e6ngelige, brug f\u00f8lgende kode.<\/p>\n<p><\/p>\n<p><code>devtools::install_github(\"tidyverse\/tidyr\")<\/code><\/p>\n<p><\/p>\n<p>P\u00e5 tidspunktet for skrivningen er disse funktioner kun tilg\u00e6ngelige i dev versionen af pakken p\u00e5 GitHub.<\/p>\n<p><\/p>\n<h3 id=\"perehod-na-novye-funkcii\">Overgang til de nye funktioner<\/h3>\n<p><\/p>\n<p>Det er faktisk ikke sv\u00e6rt at konvertere gamle scripts til at arbejde med de nye funktioner, for bedre at forst\u00e5 dette, tager jeg et eksempel fra dokumentationen for de gamle funktioner og viser, hvordan de samme operationer udf\u00f8res med de nye <code>pivot_*()<\/code> funktioner.<\/p>\n<p><\/p>\n<p>Transformation fra bredt format til langt.<\/p>\n<p>\n<b class=\"spoiler_title\">Eksempel p\u00e5 kode fra dokumentationen til 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>Transformation fra langt format til bredt.<\/p>\n<p>\n<b class=\"spoiler_title\">Eksempel p\u00e5 kode fra dokumentationen til 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>Da der i de ovenst\u00e5ende eksempler arbejdes med <code>pivot_longer()<\/code> og <code>pivot_wider()<\/code>, er der i den oprindelige tabel <em>stocks<\/em> ingen kolonner n\u00e6vnt i argumenterne <em>names_to<\/em> og <em>values_to<\/em> deres navne skal angives i citationstegn.<\/p>\n<p><\/p>\n<p>En tabel, som vil g\u00f8re det lettere for dig at forst\u00e5, hvordan du g\u00e5r over til at arbejde med det nye koncept <strong>tidyr<\/strong>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"R-pakken tidyr og dets nye funktioner pivot_longer og 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\">Bem\u00e6rkning fra forfatteren<\/h2>\n<p><\/p>\n<blockquote><p>Hele den efterf\u00f8lgende tekst er en adaptiv, jeg ville endda sige fri overs\u00e6ttelse <noindex><a rel=\"nofollow\" href=\"https:\/\/tidyr.tidyverse.org\/dev\/articles\/pivot.html\">vignetter<\/a><\/noindex> fra den officielle hjemmeside for tidyverse-biblioteket.<\/p><\/blockquote>\n<p><\/p>\n<h2 id=\"prostoy-primer-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy\">Et enkelt eksempel p\u00e5 transformation af data fra bredt format til langt<\/h2>\n<p><\/p>\n<p><code>pivot_longer ()<\/code> \u2014 g\u00f8r datas\u00e6t l\u00e6ngere, ved at reducere antallet af kolonner og \u00f8ge antallet af r\u00e6kker.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"R-pakken tidyr og dets nye funktioner pivot_longer og pivot_wider\" src=\"\/wp-content\/uploads\/2020\/04\/fc88b99f2fecdcdaa6179d2e7d29e59d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>For at udf\u00f8re de eksempler, der pr\u00e6senteres i artiklen, skal de n\u00f8dvendige pakker f\u00f8rst inkluderes:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">library(tidyr)\nlibrary(dplyr)\nlibrary(readr)<\/code><\/pre>\n<p><\/p>\n<p>Antag, at vi har en tabel med resultaterne af en unders\u00f8gelse, hvor der (blandt andet) blev spurgt folk om deres religion og \u00e5rsindkomst:<\/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>Denne tabel indeholder data om respondenternes religion i r\u00e6kkerne, mens indkomstniveauet er spredt over kolonnenavne. Antallet af respondenter fra hver kategori opbevares i cellev\u00e6rdierne p\u00e5 krydsningen mellem religion og indkomstniveau. For at f\u00e5 tabellen i et p\u00e6nt, korrekt format er det nok at bruge <code>pivot_longer()<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">pew %&gt;% \n  pivot_longer(cols = -religion, names_to = \"indkomst\", values_to = \"antal\")<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">pew %&gt;% \n  pivot_longer(cols = -religion, names_to = \"indkomst\", values_to = \"antal\")\n#&gt; # En tibble: 180 x 3\n#&gt;    religion indkomst           antal\n#&gt;                       \n#&gt;  1 Agnostiker   2 Agnostiker $10-20k             34\n#&gt;  3 Agnostiker $20-30k             60\n#&gt;  4 Agnostiker $30-40k             81\n#&gt;  5 Agnostiker $40-50k             76\n#&gt;  6 Agnostiker $50-75k            137\n#&gt;  7 Agnostiker $75-100k           122\n#&gt;  8 Agnostiker $100-150k          109\n#&gt;  9 Agnostiker &gt;150k               84\n#&gt; 10 Agnostiker Ved ikke\/afvist     96\n#&gt; # \u2026 med 170 flere r\u00e6kker<\/code><\/pre>\n<p><\/p>\n<p>Funktionsargumenter <code>pivot_longer()<\/code><\/p>\n<p><\/p>\n<ul>\n<li>Det f\u00f8rste argument <em>cols<\/em>, beskriver hvilke kolonner der skal samles. I dette tilf\u00e6lde alle kolonner bortset fra <em>time<\/em>.<\/li>\n<li>Argumentet <em>names_to<\/em> giver et navn til den variabel, der vil blive oprettet ud fra kolonnenavnene, som vi har samlet.<\/li>\n<li><em>values_to<\/em> giver et navn til den variabel, der vil blive oprettet ud fra dataene lagret i cellev\u00e6rdierne i de samlede kolonner.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"specifikacii\">Specificationer<\/h2>\n<p><\/p>\n<p>Dette er den nye funktionalitet i pakken <strong>tidyr<\/strong>, som tidligere var utilg\u00e6ngelig, n\u00e5r man arbejdede med for\u00e6ldede funktioner.<\/p>\n<p><\/p>\n<p>Specificationen er et datas\u00e6t, hvor hver r\u00e6kke svarer til en kolonne i det nye output-datas\u00e6t, og to specielle kolonner, der starter med: <\/p>\n<p><\/p>\n<ul>\n<li><em>.name<\/em> indeholder det oprindelige kolonnenavn. <\/li>\n<li><em>.value<\/em> indeholder navnet p\u00e5 den kolonne, hvor cellev\u00e6rdierne vil blive placeret. <\/li>\n<\/ul>\n<p><\/p>\n<p>De \u00f8vrige kolonner i specifikationen afspejler hvordan kolonnenavne fra <em>.name<\/em>.<\/p>\n<p><\/p>\n<p>Specificationen beskriver metadataene gemt i kolonnenavnet, med en r\u00e6kke for hver kolonne og en kolonne for hver variabel samlet med kolonnenavnet, det kan virke forvirrende nu, men efter at have gennemg\u00e5et flere eksempler vil det blive meget klarere.<\/p>\n<p><\/p>\n<p>Meningen med specifikationen er, at du kan udtr\u00e6kke, \u00e6ndre og angive nye metadata til den transformerede dataframe.<\/p>\n<p><\/p>\n<p>Den fungerer til at arbejde med specifikationer, n\u00e5r tabellen omformes fra bred til lang, og bruger funktionen <code>pivot_longer_spec()<\/code>.<\/p>\n<p><\/p>\n<p>Hvordan denne funktion fungerer, er at den tager enhver dataframe og danner dens metadata som beskrevet ovenfor. <\/p>\n<p><\/p>\n<p>Som eksempel lad os tage datas\u00e6ttet who, som leveres med pakken <strong>tidyr<\/strong>. Dette datas\u00e6t indeholder oplysninger leveret af Verdenssundhedsorganisationen om forekomsten af tuberkulose.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">who\n#&gt; # A tibble: 7.240 x 60\n#&gt;    land iso2  iso3   \u00e5r ny_sp_m014 ny_sp_m1524 ny_sp_m2534\n#&gt;                                \n#&gt;  1 Afghan\u2026 AF    AFG    1980          NA           NA           NA\n#&gt;  2 Afghan\u2026 AF    AFG    1981          NA           NA           NA\n#&gt;  3 Afghan\u2026 AF    AFG    1982          NA           NA           NA\n#&gt;  4 Afghan\u2026 AF    AFG    1983          NA           NA           NA\n#&gt;  5 Afghan\u2026 AF    AFG    1984          NA           NA           NA\n#&gt;  6 Afghan\u2026 AF    AFG    1985          NA           NA           NA\n#&gt;  7 Afghan\u2026 AF    AFG    1986          NA           NA           NA\n#&gt;  8 Afghan\u2026 AF    AFG    1987          NA           NA           NA\n#&gt;  9 Afghan\u2026 AF    AFG    1988          NA           NA           NA\n#&gt; 10 Afghan\u2026 AF    AFG    1989          NA           NA           NA\n#&gt; # \u2026 med 7.230 flere r\u00e6kker, og 53 flere variabler<\/code><\/pre>\n<p><\/p>\n<p>Lad os bygge specifikationen.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec %\n  pivot_longer_spec(new_sp_m014:newrel_f65, values_to = \"antal\")<\/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>Felter <em>land<\/em>, <em>iso2<\/em>, <em>iso3<\/em> er allerede variabler. Vores opgave er at vende kolonnerne med <em>new_sp_m014<\/em> efter <em>newrel_f65<\/em>.<\/p>\n<p><\/p>\n<p>I navne p\u00e5 disse kolonner gemmes f\u00f8lgende oplysninger:<\/p>\n<p><\/p>\n<ul>\n<li>Pr\u00e6fiks <code>new_<\/code> angiver, at kolonnen indeholder data om nye tilf\u00e6lde af tuberkulose; den nuv\u00e6rende dataramme indeholder kun oplysninger om nye sygdomstilf\u00e6lde, s\u00e5 dette pr\u00e6fiks b\u00e6rer ingen meningsfuld belastning i denne kontekst.<\/li>\n<li><code>sp<\/code>\/<code>rel<\/code>\/<code>sp<\/code>\/<code>ep<\/code> beskriver metoden til sygdomsdiagnose.<\/li>\n<li><code>m<\/code>\/<code>f<\/code> patientens k\u00f8n.<\/li>\n<li><code>014<\/code>\/<code>1524<\/code>\/<code>2535<\/code>\/<code>3544<\/code>\/<code>4554<\/code>\/<code>65<\/code> patientens aldersgruppe.<\/li>\n<\/ul>\n<p><\/p>\n<p>Vi kan adskille disse kolonner med funktionen <code>extract()<\/code>, ved brug af et regul\u00e6rt udtryk.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec %\n        extract(name, c(\"diagnose\", \"k\u00f8n\", \"alder\"), \"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>Bem\u00e6rk, at kolonnen <em>.name<\/em> skal forblive u\u00e6ndret, da det er vores indeks i kolonnenavne fra det oprindelige datas\u00e6t. <\/p>\n<p><\/p>\n<p>K\u00f8n og alder (kolonnerne <em>gender<\/em> og <em>age<\/em>) har faste og kendte v\u00e6rdier, derfor anbefales det at konvertere disse kolonner til faktorer:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec %\n            mutate(\n              k\u00f8n = factor(k\u00f8n, levels = c(\"f\", \"m\")),\n              alder = factor(alder, levels = unique(alder), ordered = TRUE)\n            ) <\/code><\/pre>\n<p><\/p>\n<p>Endelig, for at anvende den specifikation, vi har oprettet, p\u00e5 den oprindelige dataramme <em>who<\/em> skal vi bruge 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>Alt, hvad vi lige har gjort, kan skematiseres som f\u00f8lger:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"R-pakken tidyr og dets nye funktioner pivot_longer og 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 brug af flere v\u00e6rdier (.value)<\/h2>\n<p><\/p>\n<p>I det ovenst\u00e5ende eksempel skal kolonnen for specifikationen <em>.value<\/em> indeholdt kun \u00e9n v\u00e6rdi, hvilket ofte er tilf\u00e6ldet. <\/p>\n<p><\/p>\n<p>Men lejlighedsvis kan der opst\u00e5 en situation, hvor det er n\u00f8dvendigt at samle data fra kolonner med forskellige datatyper. Ved hj\u00e6lp af den for\u00e6ldede funktion <code>spread()<\/code> ville det v\u00e6re temmelig vanskeligt at g\u00f8re.<\/p>\n<p><\/p>\n<p>Det f\u00f8lgende eksempel er hentet fra <noindex><a rel=\"nofollow\" href=\"https:\/\/cran.r-project.org\/web\/packages\/data.table\/vignettes\/datatable-reshape.html\">vignetter<\/a><\/noindex> til pakken <strong>data.table<\/strong>.<\/p>\n<p><\/p>\n<p>Lad os oprette et tr\u00e6ningsdataframe.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">familie &lt;- tibble::tribble(\n  ~familie,  ~dob_barn1,  ~dob_barn2, ~k\u00f8n_barn1, ~k\u00f8n_barn2,\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)\nfamilie % 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>Det oprettede data frame indeholder for hver r\u00e6kke oplysninger om b\u00f8rn i \u00e9n familie. I familier kan der v\u00e6re \u00e9t eller to b\u00f8rn. For hvert barn gives der oplysninger om f\u00f8dselsdato og k\u00f8n, hvor dataene for hvert barn ligger i separate kolonner; vores opgave er at bringe disse data i et format, der er korrekt til analyse.<\/p>\n<p><\/p>\n<p>Bem\u00e6rk, at vi har to variable med information om hvert barn: dets k\u00f8n og f\u00f8dselsdato (kolonner med pr\u00e6fikset <em>dob<\/em> indeholder f\u00f8dselsdato, kolonner med pr\u00e6fikset <em>gender<\/em> indeholder barnets k\u00f8n). I det forventede resultat skal de v\u00e6re i separate kolonner. Vi kan g\u00f8re dette ved at generere en specifikation, hvor kolonnen <code>.value<\/code> vil have to forskellige v\u00e6rdier.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec %\n  pivot_longer_spec(-familie) %&gt;%\n  separate(col = name, into = c(\".value\", \"barn\")) %&gt;%\n  mutate(barn = parse_number(barn))\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>Lad os tage det trin for trin, hvilke handlinger der udf\u00f8res i den ovenfor n\u00e6vnte kode.<\/p>\n<p><\/p>\n<ul>\n<li><code>pivot_longer_spec(-family)<\/code> \u2014 vi opretter en specifikation, der komprimerer alle eksisterende kolonner undtagen kolonnen family.<\/li>\n<li><code>separate(col = name, into = c(\".value\", \"barn\"))<\/code> \u2014 vi opdeler kolonnen <em>.name<\/em>, som indeholder navne p\u00e5 de oprindelige felter, efter understregning og placerer de opn\u00e5ede v\u00e6rdier i kolonnerne <em>.value<\/em> og <em>child<\/em>.<\/li>\n<li><code>mutate(child = parse_number(child))<\/code> \u2014 vi konverterer v\u00e6rdierne i feltet <em>child<\/em> fra tekst til numerisk datatype.<\/li>\n<\/ul>\n<p><\/p>\n<p>Nu kan vi anvende den opn\u00e5ede specifikation p\u00e5 det oprindelige dataframe og bringe tabellen i den \u00f8nskede form.<\/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 bruger argumentet <code>na.rm = TRUE<\/code>, fordi den nuv\u00e6rende datamodel tvinger os til at oprette un\u00f8dvendige r\u00e6kker for ikke-eksisterende observationer. Da familie 2 kun har \u00e9t barn, <code>na.rm = TRUE<\/code> garanterer, at familie 2 vil have \u00e9n r\u00e6kke i outputtet.<\/p>\n<p><\/p>\n<h2 id=\"preobrazovanie-data-freymov-iz-dlinnogo-formata-k-shirokomu\">Transformation af dataframes fra langt format til bredt<\/h2>\n<p><\/p>\n<p><code>pivot_wider()<\/code> \u2014 er den omvendte transformation og omvendt \u00f8ger antallet af kolonner i dataframen ved at reducere antallet af r\u00e6kker.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"R-pakken tidyr og dets nye funktioner pivot_longer og pivot_wider\" src=\"\/wp-content\/uploads\/2020\/04\/b470664e06f362d6f0ea6df9c1ed426d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Denne type transformation bruges sj\u00e6ldent til at bringe data i et p\u00e6nt format, men denne teknik kan v\u00e6re nyttig til at oprette pivottabeller til brug i pr\u00e6sentationer eller til integration med andre v\u00e6rkt\u00f8jer.<\/p>\n<p><\/p>\n<p>I virkeligheden er funktionerne <code>pivot_longer()<\/code> og <code>pivot_wider()<\/code> symmetrisk og udf\u00f8rer modsatte handlinger, dvs: <code>df %&gt;% pivot_longer(spec = spec) %&gt;% pivot_wider(spec = spec)<\/code> og <code>df %&gt;% pivot_wider(spec = spec) %&gt;% pivot_longer(spec = spec)<\/code> vil returnere den oprindelige df.<\/p>\n<p><\/p>\n<h3 id=\"prosteyshiy-primer-privedeniya-tablicy-k-shirokomu-formatu\">Det enkleste eksempel p\u00e5 at bringe en tabel til bredt format<\/h3>\n<p><\/p>\n<p>For at demonstrere funktionen <code>pivot_wider()<\/code> vil vi bruge datas\u00e6ttet <em>fish_encounters<\/em>, som indeholder oplysninger om, hvordan forskellige stationer registrerer fiskebev\u00e6gelser 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 fleste tilf\u00e6lde vil denne tabel v\u00e6re mere informativ og praktisk, hvis oplysningerne pr\u00e6senteres i separate kolonner for hver station.<\/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;    fish  Release I80_1 Lisbon  Rstr Base_TD   BCE   BCW  BCE2  BCW2   MAE\n#&gt;        &amp;;  &amp;;  &amp;;   &amp;; &amp;; &amp;; &amp;; &amp;; &amp;;\n#&gt;  1 4842        1     1      1     1       1     1     1     1     1     1\n#&gt;  2 4843        1     1      1     1       1     1     1     1     1     1\n#&gt;  3 4844        1     1      1     1       1     1     1     1     1     1\n#&gt;  4 4845        1     1      1     1       1    NA    NA    NA    NA    NA\n#&gt;  5 4847        1     1      1    NA      NA    NA    NA    NA    NA    NA\n#&gt;  6 4848        1     1      1     1      NA    NA    NA    NA    NA    NA\n#&gt;  7 4849        1     1     NA    NA      NA    NA    NA    NA    NA    NA\n#&gt;  8 4850        1     1     NA     1       1     1     1    NA    NA    NA\n#&gt;  9 4851        1     1     NA    NA      NA    NA    NA    NA    NA    NA\n#&gt; 10 4854        1     1     NA    NA      NA    NA    NA    NA    NA    NA\n#&gt; # \u2026 med 9 flere r\u00e6kker, og 1 mere variabel: MAW<\/code><\/pre>\n<p><\/p>\n<p>Dette datas\u00e6t registrerer kun oplysningerne, n\u00e5r fisken er blevet registreret af stationen, dvs. hvis en fisk ikke er blevet fanget af en station, vil der ikke v\u00e6re s\u00e5danne data i tabellen. Dette betyder, at outputtet vil blive fyldt med NA. <\/p>\n<p><\/p>\n<p>Men i dette tilf\u00e6lde ved vi, at mangel p\u00e5 registrering betyder, at fisken ikke blev set, s\u00e5 vi kan bruge argumentet <em>values_fill<\/em> i funktionen <code>pivot_wider()<\/code> og udfylde disse manglende v\u00e6rdier med nuller:<\/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 af kolonnenavn ud fra flere oprindelige variabler<\/h3>\n<p><\/p>\n<p>Forestil dig, at vi har en tabel, der indeholder en kombination af produkter, lande og \u00e5r. For at generere et test datas\u00e6t kan du k\u00f8re f\u00f8lgende kode:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">df %\n  filter((produkt == \"A\" &amp; land == \"AI\") | produkt == \"B\") %&gt;% \n  mutate(v\u00e6rdi = 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>Vores opgave er at udvide datas\u00e6ttet, s\u00e5 en kolonne indeholder data for hver kombination af produkt og land. For at g\u00f8re dette skal du blot sende til argumentet <em>names_from<\/em> en vektor, der indeholder navne p\u00e5 de kombinerede felter.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">df %&gt;% pivot_wider(names_from = c(produkt, land),\n                 values_from = \"v\u00e6rdi\")<\/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 ogs\u00e5 anvende specifikationerne til funktionen <code>pivot_wider()<\/code>. Men n\u00e5r den gives i <code>pivot_wider()<\/code> specificeringen udf\u00f8rer en transformation, der er modsat <code>pivot_longer()<\/code>: kolonner oprettes, som angivet i <em>.name<\/em>, ved brug af v\u00e6rdier fra <em>.value<\/em> og andre kolonner.<\/p>\n<p><\/p>\n<p>For dette datas\u00e6t kan du generere en brugerdefineret specifikation, hvis du \u00f8nsker, at hver mulig kombination af land og produkt skal have sin egen kolonne, ikke kun dem, der er til stede i dataene:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec % \n  expand(produkt, land, .value = \"v\u00e6rdi\") %&gt;% \n  unite(\".name\", produkt, land, 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\">Flere avancerede eksempler p\u00e5 arbejde med det nye tidyr-koncept<\/h2>\n<p><\/p>\n<h3 id=\"privedenie-dannyh-k-akkuratnomu-vidu-na-primere-nabora-dannyh-o-perepisi-dohoda-i-arendnoy-platy-v-ssha\">Bringing data into a tidy format med eksemplet p\u00e5 datas\u00e6t om indkomst og husleje i USA<\/h3>\n<p><\/p>\n<p>Datas\u00e6ttet <em>us_rent_income<\/em> indeholder oplysninger om gennemsnitsindkomsten og huslejen for hver stat i USA for 2017 (datas\u00e6ttet er tilg\u00e6ngeligt i pakken <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 flere r\u00e6kker<\/code><\/pre>\n<p><\/p>\n<p>I den form, som dataene er gemt i datas\u00e6ttet <em>us_rent_income<\/em> er det ekstremt besv\u00e6rligt at arbejde med dem, s\u00e5 vi \u00f8nsker at oprette et datas\u00e6t med kolonnerne: <em>rent<\/em>, <em>rent_moe<\/em>, <em>come<\/em>, <em>income_moe<\/em>. Der er mange m\u00e5der at oprette denne specifikation p\u00e5, men det vigtigste er, at vi skal generere hver kombination af variabelv\u00e6rdierne og <em>estimate\/moe<\/em>, og derefter generere kolonnenavnet.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">  spec % \n    expand(variable, .value = c(\"estimat\", \"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>At give denne specifikation <code>pivot_wider()<\/code> giver os det resultat, vi s\u00f8ger:<\/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\">Verdensbanken<\/h3>\n<p><\/p>\n<p>Nogle gange kr\u00e6ver det flere skridt at f\u00e5 et datas\u00e6t i den \u00f8nskede form.<br \/>\nDatas\u00e6t <em>world_bank_pop<\/em> indeholder data fra Verdensbanken om befolkningen i hvert land fra 2000 til 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>Vores m\u00e5l er at skabe et p\u00e6nt datas\u00e6t, hvor hver variabel er i sin egen kolonne. Det er stadig uklart, hvilke trin der er n\u00f8dvendige, men vi begynder med det mest oplagte problem: \u00e5ret er fordelt over flere kolonner.<\/p>\n<p><\/p>\n<p>For at rette dette skal vi bruge funktionen <code>pivot_longer()<\/code>.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">pop2 % \n  pivot_longer(`2000`:`2017`, names_to = \"\u00e5r\")<\/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\u00e6ste skridt er at se p\u00e5 variablen 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>Hvor SP.POP.GROW er befolkningstilv\u00e6ksten, SP.POP.TOTL er den samlede befolkning, og SP.URB.* er det samme, men kun for byomr\u00e5der. Lad os opdele disse v\u00e6rdier i to variabler: area \u2014 omr\u00e5de (total eller urban) og en variabel, der indeholder de faktiske data (population eller growth):<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">pop3 % \n  separate(indicator, c(NA, \"omr\u00e5de\", \"variabel\") )<\/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 er det kun tilbage at opdele variablen variable i to kolonner:<\/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\">Kontaktliste<\/h3>\n<p><\/p>\n<p>I det sidste eksempel, forestil dig at du har en kontaktliste, som du har kopieret og indsat fra en webside:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">kontakter &lt;- tribble(\n  ~felt, ~v\u00e6rdi,\n  &quot;navn&quot;, &quot;Jiena McLellan&quot;,\n  &quot;virksomhed&quot;, &quot;Toyota&quot;, \n  &quot;navn&quot;, &quot;John Smith&quot;, \n  &quot;virksomhed&quot;, &quot;google&quot;, \n  &quot;email&quot;, &quot;john@google.com&quot;,\n  &quot;navn&quot;, &quot;Huxley Ratcliffe&quot;\n)<\/code><\/pre>\n<p><\/p>\n<p>Det er ret sv\u00e6rt at bringe denne liste i tabelformat, fordi der ikke findes en variabel, der identificerer, hvilke data der tilh\u00f8rer hvilken kontakt. Vi kan dog rette dette ved at bem\u00e6rke, at dataene for hver ny kontakt starter med navnet (&quot;name&quot;), s\u00e5 vi kan oprette en unik identifikator og \u00f8ge den med \u00e9n hver gang, der findes v\u00e6rdien \u201cname\u201d i kolonnen field:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">contacts &lt;- contacts %&gt;% \n  mutate(\n    person_id = cumsum(field == &quot;name&quot;)\n  )\ncontacts<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 6 x 3\n#&gt;   field   value            person_id\n#&gt;   &lt;chr&gt;   &lt;chr&gt;                &lt;int&gt;\n#&gt; 1 name    Jiena McLellan           1\n#&gt; 2 company Toyota                   1\n#&gt; 3 name    John Smith               2\n#&gt; 4 company google                   2\n#&gt; 5 email   john@google.com          2\n#&gt; 6 name    Huxley Ratcliffe         3<\/code><\/pre>\n<p><\/p>\n<p>Nu, hvor vi har en unik identifikator for hver kontakt, kan vi dreje feltet og v\u00e6rdien til kolonner:<\/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\">Konklusion<\/h2>\n<p><\/p>\n<p>Personligt mener jeg, at det nye koncept <strong>tidyr<\/strong> er faktisk meget mere intuitivt og langt overg\u00e5r de for\u00e6ldede funktioner <code>spread()<\/code> og <code>gather()<\/code>. Jeg h\u00e5ber, at denne artikel har hjulpet dig med at forst\u00e5 <code>pivot_longer()<\/code> og <code>pivot_wider()<\/code>.<\/p>\n<p>Kilde: <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.3 - 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\/da\/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.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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-pakken tidyr og dens nye funktioner pivot_longer og pivot_wider | ProHoster","description":"Pakken tidyr er en del af kernen i et af de mest popul\u00e6re biblioteker i R \u2014 tidyverse. Pakken har til form\u00e5l at organisere data p\u00e5 en p\u00e6n m\u00e5de. P\u00e5 Habr.","canonical_url":"https:\/\/prohoster.info\/da\/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":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/76291","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=76291"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/76291\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/76292"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=76291"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=76291"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=76291"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}