{"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\/cs\/blog\/administrirovanie\/r-paket-tidyr-i-ego-novye-funkczii-pivot_longer-i-pivot_wider","title":{"rendered":"R bal\u00ed\u010dek tidyr a jeho nov\u00e9 funkce pivot_longer a pivot_wider","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Bal\u00ed\u010dek <strong>tidyr<\/strong> je sou\u010d\u00e1st\u00ed jedn\u00e9 z nejpopul\u00e1rn\u011bj\u0161\u00edch knihoven v jazyce R \u2014 <strong>tidyverse<\/strong>.<br \/>\nHlavn\u00edm \u00fa\u010delem bal\u00ed\u010dku je \u00faprava dat do p\u0159ehledn\u00e9ho form\u00e1tu.<\/p>\n<p><\/p>\n<p>Na Habr ji\u017e existuje <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/248741\/\">publikace<\/a><\/noindex> v\u011bnovan\u00fd tomuto bal\u00ed\u010dku, ale datuje se do roku 2015. Chci se v\u0161ak pod\u011blit o nejaktu\u00e1ln\u011bj\u0161\u00ed zm\u011bny, o kter\u00fdch p\u0159ed n\u011bkolika dny informoval jeho autor Hadley Wickham.<\/p>\n<p>\n<img decoding=\"async\" alt=\"R bal\u00ed\u010dek tidyr a jeho nov\u00e9 funkce pivot_longer a pivot_wider\" src=\"\/wp-content\/uploads\/2020\/04\/a290263b63aaea3db70e83a1ec411415.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<blockquote><p><b>SJK<\/b>: Budou funkce gather() a spread() pova\u017eov\u00e1ny za zastaral\u00e9?<\/p>\n<p><b>Hadley Wickham<\/b>: Do ur\u010dit\u00e9 m\u00edry. P\u0159estaneme doporu\u010dovat pou\u017e\u00edv\u00e1n\u00ed t\u011bchto funkc\u00ed a opravovat v nich chyby, ale i nad\u00e1le budou p\u0159\u00edtomny v bal\u00ed\u010dku v sou\u010dasn\u00e9m stavu.<\/p><\/blockquote>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"soderzhanie\">Obsah<\/h2>\n<p><\/p>\n<p><em>Pokud se zaj\u00edm\u00e1te o anal\u00fdzu dat, mo\u017en\u00e1 v\u00e1s zaujmou m\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/R4marketing\">telegram<\/a><\/noindex> a <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/R4marketing\/?sub_confirmation=1\">youtube<\/a><\/noindex> kan\u00e1ly. V\u011bt\u0161ina obsahu je v\u011bnov\u00e1na jazyku R.<\/em><\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"#koncepciya-tidydata\">Koncept TidyData<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#osnovnye-funkcii-vhodyaschie-v-paket-tydir\">Hlavn\u00ed funkce zahrnut\u00e9 v bal\u00ed\u010dku tidyr<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#novaya-koncepciya-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy-i-naoborot\">Nov\u00fd koncept p\u0159evodu dat z \u0161irok\u00e9ho form\u00e1tu do dlouh\u00e9ho a naopak<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/ustnovka-naibolee-aktualnoy-versii-tidyr-0839000\">Instalace nejaktu\u00e1ln\u011bj\u0161\u00ed verze tidyr 0.8.3.9000<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#perehod-na-novye-funkcii\">P\u0159echod na nov\u00e9 funkce<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#prostoy-primer-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy\">Jednoduch\u00fd p\u0159\u00edklad p\u0159evodu dat z \u0161irok\u00e9ho form\u00e1tu na dlouh\u00fd<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#specifikacii\">Specifikace<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#specifikaciya-s-ispolzovaniem-neskolkih-znacheniyvalue\">Specifikace s vyu\u017eit\u00edm v\u00edce hodnot (.value)<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#preobrazovanie-data-freymov-iz-dlinnogo-formata-k-shirokomu\">P\u0159evod datov\u00fdch r\u00e1mc\u016f z dlouh\u00e9ho form\u00e1tu do \u0161irok\u00e9ho<\/a><\/noindex>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"#prosteyshiy-primer-privedeniya-tablicy-k-shirokomu-formatu\">Nejjednodu\u0161\u0161\u00ed p\u0159\u00edklad \u00fapravy tabulky na \u0161irok\u00fd form\u00e1t<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#generaciya-imeni-stolbca-iz-neskolkih-ishodnyh-peremennyh\">Generov\u00e1n\u00ed n\u00e1zvu sloupce z n\u011bkolika p\u016fvodn\u00edch prom\u011bnn\u00fdch<\/a><\/noindex><\/li>\n<\/ul>\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#neskolko-prodvinutyh-primerov-raboty-s-novoy-koncepciey-tidyr\">N\u011bkolik pokro\u010dil\u00fdch p\u0159\u00edklad\u016f pr\u00e1ce s nov\u00fdm konceptem 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\">\u00daprava dat do p\u0159ehledn\u00e9ho form\u00e1tu na p\u0159\u00edkladu souboru dat o p\u0159\u00edjmech a n\u00e1jemn\u00e9m v USA<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#vsemirnyy-bank\">Sv\u011btov\u00e1 banka<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#spisok-kontaktov\">Seznam kontakt\u016f<\/a><\/noindex><\/li>\n<\/ul>\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#zaklyuchenie\">Z\u00e1v\u011br<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"koncepciya-tidydata\">Koncept TidyData<\/h2>\n<p><\/p>\n<p>C\u00edl <strong>tidyr<\/strong> \u2014 pomoci v\u00e1m upravit data do tzv. p\u0159ehledn\u00e9ho form\u00e1tu. P\u0159ehledn\u00e1 data jsou data, kde: <\/p>\n<p><\/p>\n<ul>\n<li>Ka\u017ed\u00e1 prom\u011bnn\u00e1 je ve sloupci. <\/li>\n<li>Ka\u017ed\u00e9 pozorov\u00e1n\u00ed je \u0159\u00e1dek. <\/li>\n<li>Ka\u017ed\u00e1 hodnota je bu\u0148ka.<\/li>\n<\/ul>\n<p><\/p>\n<p>S daty, kter\u00e1 jsou upravena do tidy data, je mnohem snadn\u011bj\u0161\u00ed a pohodln\u011bj\u0161\u00ed pracovat p\u0159i anal\u00fdze.<\/p>\n<p><\/p>\n<h2 id=\"osnovnye-funkcii-vhodyaschie-v-paket-tidyr\">Hlavn\u00ed funkce zahrnut\u00e9 v bal\u00ed\u010dku tidyr<\/h2>\n<p><\/p>\n<p>tidyr obsahuje sadu funkc\u00ed ur\u010den\u00fdch k transformaci tabulek:<\/p>\n<p><\/p>\n<ul>\n<li><code>fill()<\/code> \u2014 vypln\u011bn\u00ed chyb\u011bj\u00edc\u00edch hodnot ve sloupci p\u0159edchoz\u00edmi hodnotami;<\/li>\n<li><code>separate()<\/code> \u2014 rozd\u011bl\u00ed jedno pole na n\u011bkolik podle odd\u011blova\u010de;<\/li>\n<li><code>unite()<\/code> \u2014 prov\u00e1d\u00ed operaci spojen\u00ed n\u011bkolika pol\u00ed do jednoho, co\u017e je opa\u010dn\u00e9 k funkci <code>separate()<\/code>;<\/li>\n<li><code>pivot_longer()<\/code> \u2014 funkce, kter\u00e1 p\u0159ev\u00e1d\u00ed data z \u0161irok\u00e9ho form\u00e1tu do dlouh\u00e9ho;<\/li>\n<li><code>pivot_wider()<\/code> \u2014 funkce, kter\u00e1 p\u0159ev\u00e1d\u00ed data z dlouh\u00e9ho form\u00e1tu do \u0161irok\u00e9ho. Operace je opa\u010dn\u00e1 t\u00e9, kterou prov\u00e1d\u00ed funkce <code>pivot_longer()<\/code>.<\/li>\n<li><code>gather()<\/code><strong>zastaral\u00e1<\/strong> \u2014 funkce, kter\u00e1 p\u0159ev\u00e1d\u00ed data z \u0161irok\u00e9ho form\u00e1tu do dlouh\u00e9ho;<\/li>\n<li><code>spread()<\/code><strong>zastaral\u00e1<\/strong> \u2014 funkce, kter\u00e1 p\u0159ev\u00e1d\u00ed data z dlouh\u00e9ho form\u00e1tu do \u0161irok\u00e9ho. Operace je opa\u010dn\u00e1 t\u00e9, kterou prov\u00e1d\u00ed funkce <code>gather()<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"novaya-koncepciya-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy-i-naoborot\">Nov\u00fd koncept p\u0159evodu dat z \u0161irok\u00e9ho form\u00e1tu do dlouh\u00e9ho a naopak<\/h2>\n<p><\/p>\n<p>D\u0159\u00edve se pro takov\u00fd typ transformace pou\u017e\u00edvaly funkce <code>gather()<\/code> a <code>spread()<\/code>. V pr\u016fb\u011bhu let existence t\u011bchto funkc\u00ed se uk\u00e1zalo, \u017ee pro v\u011bt\u0161inu u\u017eivatel\u016f, v\u010detn\u011b autora bal\u00ed\u010dku, n\u00e1zvy t\u011bchto funkc\u00ed a jejich argument\u016f byly dost obt\u00ed\u017en\u011b pochopiteln\u00e9 a zp\u016fsobovaly pot\u00ed\u017ee p\u0159i jejich hled\u00e1n\u00ed a pochopen\u00ed toho, kter\u00e1 z t\u011bchto funkc\u00ed p\u0159ev\u00e1d\u00ed datov\u00fd r\u00e1mec z \u0161irok\u00e9ho do dlouh\u00e9ho form\u00e1tu a naopak.<\/p>\n<p><\/p>\n<p>V d\u016fsledku toho byly <strong>tidyr<\/strong> p\u0159id\u00e1ny dv\u011b nov\u00e9, d\u016fle\u017eit\u00e9 funkce, kter\u00e9 jsou ur\u010deny k transformaci datov\u00fdch r\u00e1mc\u016f.<\/p>\n<p><\/p>\n<p>Nov\u00e9 funkce <code>pivot_longer()<\/code> a <code>pivot_wider()<\/code> byly vytvo\u0159eny pod vlivem n\u011bkter\u00fdch funkc\u00ed z bal\u00ed\u010dku <strong>cdata<\/strong>, kter\u00fd vytvo\u0159il John Mount a Nina Zumel.<\/p>\n<p><\/p>\n<h3 id=\"ustanovka-naibolee-aktualnoy-versii-tidyr-0839000\">Instalace nejaktu\u00e1ln\u011bj\u0161\u00ed verze tidyr 0.8.3.9000<\/h3>\n<p><\/p>\n<p>Pro instalaci nov\u00e9, nejaktu\u00e1ln\u011bj\u0161\u00ed verze bal\u00ed\u010dku <strong>tidyr<\/strong> <em>0.8.3.9000<\/em>, ve kter\u00e9 jsou dostupn\u00e9 nov\u00e9 funkce, pou\u017eijte n\u00e1sleduj\u00edc\u00ed k\u00f3d.<\/p>\n<p><\/p>\n<p><code>devtools::install_github(\"tidyverse\/tidyr\")<\/code><\/p>\n<p><\/p>\n<p>V dob\u011b psan\u00ed \u010dl\u00e1nku jsou tyto funkce dostupn\u00e9 pouze ve v\u00fdvojov\u00e9 verzi bal\u00ed\u010dku na GitHubu.<\/p>\n<p><\/p>\n<h3 id=\"perehod-na-novye-funkcii\">P\u0159echod na nov\u00e9 funkce<\/h3>\n<p><\/p>\n<p>Ve skute\u010dnosti nen\u00ed obt\u00ed\u017en\u00e9 p\u0159ev\u00e9st star\u00e9 skripty na pr\u00e1ci s nov\u00fdmi funkcemi, pro v\u011bt\u0161\u00ed pochopen\u00ed vezmu p\u0159\u00edklad z dokumentace star\u00fdch funkc\u00ed a uk\u00e1\u017eu, jak se tyto operace prov\u00e1d\u011bj\u00ed pomoc\u00ed nov\u00fdch <code>pivot_*()<\/code> funkc\u00ed.<\/p>\n<p><\/p>\n<p>P\u0159eveden\u00ed \u0161irok\u00e9ho form\u00e1tu na dlouh\u00fd.<\/p>\n<p>\n<b class=\"spoiler_title\">P\u0159\u00edklad k\u00f3du z dokumentace funkce 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>P\u0159eveden\u00ed dlouh\u00e9ho form\u00e1tu na \u0161irok\u00fd.<\/p>\n<p>\n<b class=\"spoiler_title\">P\u0159\u00edklad k\u00f3du z dokumentace funkce 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>Jeliko\u017e v uveden\u00fdch v\u00fd\u0161e p\u0159\u00edkladech pr\u00e1ce s <code>pivot_longer()<\/code> a <code>pivot_wider()<\/code>, v p\u016fvodn\u00edm tabulkov\u00e9m form\u00e1tu <em>stocks<\/em> nejsou sloupce uveden\u00e9 v argumentech <em>names_to<\/em> a <em>values_to<\/em> jejich n\u00e1zvy je t\u0159eba uv\u00e1d\u011bt v uvozovk\u00e1ch.<\/p>\n<p><\/p>\n<p>Tabulka, se kterou v\u00e1m nejl\u00e9pe pom\u016f\u017ee pochopit, jak p\u0159ej\u00edt na pr\u00e1ci s novou koncepc\u00ed <strong>tidyr<\/strong>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"R bal\u00ed\u010dek tidyr a jeho nov\u00e9 funkce pivot_longer a 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\">Pozn\u00e1mka od autora<\/h2>\n<p><\/p>\n<blockquote><p>Cel\u00fd n\u00e1sleduj\u00edc\u00ed text je adaptivn\u00ed, dokonce bych \u0159ekl voln\u00fd p\u0159eklad <noindex><a rel=\"nofollow\" href=\"https:\/\/tidyr.tidyverse.org\/dev\/articles\/pivot.html\">vin\u011bt<\/a><\/noindex> z ofici\u00e1ln\u00edho webu knihovny tidyverse.<\/p><\/blockquote>\n<p><\/p>\n<h2 id=\"prostoy-primer-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy\">Jednoduch\u00fd p\u0159\u00edklad p\u0159evodu dat z \u0161irok\u00e9ho form\u00e1tu na dlouh\u00fd<\/h2>\n<p><\/p>\n<p><code>pivot_longer ()<\/code> \u2014 d\u011bl\u00e1 datov\u00e9 sady del\u0161\u00ed, sni\u017euje po\u010det sloupc\u016f a zvy\u0161uje po\u010det \u0159\u00e1dk\u016f.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"R bal\u00ed\u010dek tidyr a jeho nov\u00e9 funkce pivot_longer a pivot_wider\" src=\"\/wp-content\/uploads\/2020\/04\/fc88b99f2fecdcdaa6179d2e7d29e59d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pro proveden\u00ed p\u0159\u00edklad\u016f uveden\u00fdch v \u010dl\u00e1nku je nejprve nutn\u00e9 na\u010d\u00edst pot\u0159ebn\u00e9 bal\u00ed\u010dky:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">library(tidyr)\nlibrary(dplyr)\nlibrary(readr)<\/code><\/pre>\n<p><\/p>\n<p>P\u0159edpokl\u00e1dejme, \u017ee m\u00e1me tabulku s v\u00fdsledky pr\u016fzkumu, v n\u00ed\u017e (mimo jin\u00e9) se ptali lid\u00ed na jejich n\u00e1bo\u017eenstv\u00ed a ro\u010dn\u00ed p\u0159\u00edjem:<\/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>Tato tabulka obsahuje \u00fadaje o n\u00e1bo\u017eenstv\u00ed respondent\u016f v \u0159\u00e1dc\u00edch, zat\u00edmco \u00farove\u0148 p\u0159\u00edjmu je rozd\u011blena podle n\u00e1zv\u016f sloupc\u016f. Po\u010det respondent\u016f z ka\u017ed\u00e9 kategorie je ulo\u017een v hodnot\u00e1ch bun\u011bk na pr\u016fse\u010d\u00edku n\u00e1bo\u017eenstv\u00ed a \u00farovn\u011b p\u0159\u00edjmu. Pro uveden\u00ed tabulky do \u00fahledn\u00e9ho, spr\u00e1vn\u00e9ho form\u00e1tu sta\u010d\u00ed pou\u017e\u00edt <code>pivot_longer()<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">pew %&gt;% \n  pivot_longer(cols = -religion, names_to = \"p\u0159\u00edjem\", values_to = \"po\u010det\")<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">pew %&gt;% \n  pivot_longer(cols = -religion, names_to = \"p\u0159\u00edjem\", values_to = \"po\u010det\")\n#&gt; # A tibble: 180 x 3\n#&gt;    n\u00e1bo\u017eenstv\u00ed p\u0159\u00edjem             po\u010det\n#&gt;                          \n#&gt;  1 Agnostik     2 Agnostik   10-20 tis. K\u010d       34\n#&gt;  3 Agnostik   20-30 tis. K\u010d       60\n#&gt;  4 Agnostik   30-40 tis. K\u010d       81\n#&gt;  5 Agnostik   40-50 tis. K\u010d       76\n#&gt;  6 Agnostik   50-75 tis. K\u010d      137\n#&gt;  7 Agnostik   75-100 tis. K\u010d     122\n#&gt;  8 Agnostik   100-150 tis. K\u010d    109\n#&gt;  9 Agnostik   &gt;150 tis. K\u010d       84\n#&gt; 10 Agnostik   Nev\u00ed\/odm\u00edtnuto     96\n#&gt; # \u2026 s dal\u0161\u00edmi 170 \u0159\u00e1dky<\/code><\/pre>\n<p><\/p>\n<p>Argumenty funkce <code>pivot_longer()<\/code><\/p>\n<p><\/p>\n<ul>\n<li>Prvn\u00ed argument <em>cols<\/em>, popisuje, kter\u00e9 sloupce je t\u0159eba slou\u010dit. V tomto p\u0159\u00edpad\u011b v\u0161echny sloupce krom\u011b <em>\u010das<\/em>.<\/li>\n<li>Argument <em>names_to<\/em> d\u00e1v\u00e1 n\u00e1zev prom\u011bnn\u00e9, kter\u00e1 bude vytvo\u0159ena z n\u00e1zv\u016f sloupc\u016f, kter\u00e9 jsme slou\u010dili.<\/li>\n<li><em>values_to<\/em> d\u00e1v\u00e1 n\u00e1zev prom\u011bnn\u00e9, kter\u00e1 bude vytvo\u0159ena z dat ulo\u017een\u00fdch ve hodnot\u00e1ch bun\u011bk slou\u010den\u00fdch sloupc\u016f.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"specifikacii\">Specifikace<\/h2>\n<p><\/p>\n<p>Toto je nov\u00e1 funkce bal\u00ed\u010dku <strong>tidyr<\/strong>, kter\u00e1 byla d\u0159\u00edve p\u0159i pr\u00e1ci se zastaral\u00fdmi funkcemi nedostupn\u00e1.<\/p>\n<p><\/p>\n<p>Specifikace je datov\u00fd r\u00e1mec, kde ka\u017ed\u00fd \u0159\u00e1dek odpov\u00edd\u00e1 jednomu sloupci v nov\u00e9m v\u00fdstupn\u00edm datov\u00e9m r\u00e1mci, a dv\u011bma speci\u00e1ln\u00edm sloupc\u016fm, kter\u00e9 za\u010d\u00ednaj\u00ed s: <\/p>\n<p><\/p>\n<ul>\n<li><em>.*.name<\/em> obsahuje p\u016fvodn\u00ed n\u00e1zev sloupce. <\/li>\n<li><em>.value<\/em> obsahuje n\u00e1zev sloupce, do kter\u00e9ho budou vstupovat hodnoty bun\u011bk. <\/li>\n<\/ul>\n<p><\/p>\n<p>Ostatn\u00ed sloupce specifikace odr\u00e1\u017eej\u00ed, jak bude v nov\u00e9m sloupci v\u00fdstupn\u011b zobrazen n\u00e1zev slou\u010den\u00fdch sloupc\u016f z <em>.*.name<\/em>.<\/p>\n<p><\/p>\n<p>Specifikace popisuje metadata ulo\u017een\u00e1 v n\u00e1zvu sloupce, s jedn\u00edm \u0159\u00e1dkem pro ka\u017ed\u00fd sloupec a jedn\u00edm sloupcem pro ka\u017edou prom\u011bnnou slou\u010denou s n\u00e1zvem sloupce, mo\u017en\u00e1 se v\u00e1m te\u010f toto ur\u010den\u00ed zd\u00e1 matouc\u00ed, ale po zv\u00e1\u017een\u00ed n\u011bkolika p\u0159\u00edklad\u016f to bude mnohem jasn\u011bj\u0161\u00ed.<\/p>\n<p><\/p>\n<p>\u00da\u010del specifikace spo\u010d\u00edv\u00e1 v tom, \u017ee m\u016f\u017eete extrahovat, m\u011bnit a nastavovat nov\u00e1 metadata k transformovan\u00e9mu datov\u00e9mu r\u00e1mci.<\/p>\n<p><\/p>\n<p>Pro pr\u00e1ci se specifikacemi p\u0159i transformaci tabulky z \u0161irok\u00e9ho form\u00e1tu do dlouh\u00e9ho slou\u017e\u00ed funkce <code>pivot_longer_spec()<\/code>.<\/p>\n<p><\/p>\n<p>Jak tato funkce funguje, bere libovoln\u00fd datov\u00fd r\u00e1mec a formuje jeho metadata popsan\u00fdm v\u00fd\u0161e zp\u016fsobem. <\/p>\n<p><\/p>\n<p>Pro ilustraci vezmeme datovou sadu who, kter\u00e1 se dod\u00e1v\u00e1 spolu s bal\u00ed\u010dkem <strong>tidyr<\/strong>. Tato datov\u00e1 sada obsahuje informace poskytovan\u00e9 mezin\u00e1rodn\u00ed organizac\u00ed zdravotnictv\u00ed o v\u00fdskytu tuberkul\u00f3zy.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">who\n#&gt; # A tibble: 7,240 x 60\n#&gt;    country iso2  iso3   year new_sp_m014 new_sp_m1524 new_sp_m2534\n#&gt;        &amp; &amp;                       \n#&gt;  1 Afghan\u2026 AF    AFG    1980          NA           NA           NA\n#&gt;  2 Afghan\u2026 AF    AFG    1981          NA           NA           NA\n#&gt;  3 Afghan\u2026 AF    AFG    1982          NA           NA           NA\n#&gt;  4 Afghan\u2026 AF    AFG    1983          NA           NA           NA\n#&gt;  5 Afghan\u2026 AF    AFG    1984          NA           NA           NA\n#&gt;  6 Afghan\u2026 AF    AFG    1985          NA           NA           NA\n#&gt;  7 Afghan\u2026 AF    AFG    1986          NA           NA           NA\n#&gt;  8 Afghan\u2026 AF    AFG    1987          NA           NA           NA\n#&gt;  9 Afghan\u2026 AF    AFG    1988          NA           NA           NA\n#&gt; 10 Afghan\u2026 AF    AFG    1989          NA           NA           NA\n#&gt; # \u2026 with 7,230 more rows, and 53 more variables<\/code><\/pre>\n<p><\/p>\n<p>Vybudujeme jeho specifikaci.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec %\n  pivot_longer_spec(new_sp_m014:newrel_f65, values_to = \"po\u010det\")<\/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>Pole <em>country<\/em>, <em>iso2<\/em>, <em>iso3<\/em> u\u017e jsou prom\u011bnn\u00e9. Na\u0161\u00edm \u00fakolem je p\u0159evr\u00e1tit sloupce s <em>new_sp_m014<\/em> o <em>newrel_f65<\/em>.<\/p>\n<p><\/p>\n<p>V n\u00e1zvech t\u011bchto sloupc\u016f je uchov\u00e1na n\u00e1sleduj\u00edc\u00ed informace:<\/p>\n<p><\/p>\n<ul>\n<li>Prefix <code>new_<\/code> nazna\u010duje, \u017ee sloupec obsahuje data o nov\u00fdch p\u0159\u00edpadech onemocn\u011bn\u00ed tuberkul\u00f3zou, aktu\u00e1ln\u00ed datov\u00fd r\u00e1mec obsahuje informace pouze o nov\u00fdch onemocn\u011bn\u00edch, proto tento prefix v aktu\u00e1ln\u00edm kontextu nem\u00e1 \u017e\u00e1dn\u00fd v\u00fdznam.<\/li>\n<li><code>sp<\/code>\/<code>rel<\/code>\/<code>sp<\/code>\/<code>ep<\/code> popisuje zp\u016fsob diagnostiky onemocn\u011bn\u00ed.<\/li>\n<li><code>m<\/code>\/<code>f<\/code> pohlav\u00ed pacienta.<\/li>\n<li><code>014<\/code>\/<code>1524<\/code>\/<code>2535<\/code>\/<code>3544<\/code>\/<code>4554<\/code>\/<code>65<\/code> v\u011bkov\u00fd rozsah pacienta.<\/li>\n<\/ul>\n<p><\/p>\n<p>M\u016f\u017eeme tyto sloupce rozd\u011blit pomoc\u00ed funkce <code>extract()<\/code>, pomoc\u00ed regul\u00e1rn\u00edho v\u00fdrazu.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec %\n        extract(name, c(\"diagn\u00f3za\", \"pohlav\u00ed\", \"v\u011bk\"), \"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>V\u0161imn\u011bte si, \u017ee sloupec <em>.*.name<\/em> by m\u011bl z\u016fstat nezm\u011bn\u011bn, proto\u017ee je na\u0161\u00edm indexem v n\u00e1zvech sloupc\u016f p\u016fvodn\u00ed datov\u00e9 sady. <\/p>\n<p><\/p>\n<p>Pohlav\u00ed a v\u011bk (sloupce <em>gender<\/em> a <em>age<\/em>) maj\u00ed pevn\u011b stanoven\u00e9 a zn\u00e1m\u00e9 hodnoty, proto se doporu\u010duje tyto sloupce p\u0159ev\u00e9st na faktory:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec %\n            mutate(\n              pohlav\u00ed = factor(pohlav\u00ed, levels = c(\"f\", \"m\")),\n              v\u011bk = factor(v\u011bk, levels = unique(v\u011bk), ordered = TRUE)\n            ) <\/code><\/pre>\n<p><\/p>\n<p>Nakonec, abychom mohli aplikovat na\u0161i vytvo\u0159enou specifikaci na p\u016fvodn\u00ed datov\u00fd r\u00e1mec <em>who<\/em> mus\u00edme pou\u017e\u00edt argument <em>spec<\/em> ve funkci <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>V\u0161e, co jsme pr\u00e1v\u011b ud\u011blali, lze schematicky zn\u00e1zornit n\u00e1sleduj\u00edc\u00edm zp\u016fsobem:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"R bal\u00ed\u010dek tidyr a jeho nov\u00e9 funkce pivot_longer a 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\">Specifikace s vyu\u017eit\u00edm v\u00edce hodnot (.value)<\/h2>\n<p><\/p>\n<p>V uveden\u00e9m p\u0159\u00edkladu sloupec specifikace <em>.value<\/em> obsahoval pouze jednu hodnotu, co\u017e je ve v\u011bt\u0161in\u011b p\u0159\u00edpad\u016f skute\u010dn\u011b tak. <\/p>\n<p><\/p>\n<p>Ale \u010das od \u010dasu m\u016f\u017ee nastat situace, kdy budete pot\u0159ebovat shrom\u00e1\u017edit v hodnot\u00e1ch data ze sloupc\u016f s r\u016fzn\u00fdmi typy dat. S pomoc\u00ed zastaral\u00e9 funkce <code>spread()<\/code> to by bylo docela slo\u017eit\u00e9 ud\u011blat.<\/p>\n<p><\/p>\n<p>N\u00ed\u017ee uveden\u00fd p\u0159\u00edklad je p\u0159evzat z <noindex><a rel=\"nofollow\" href=\"https:\/\/cran.r-project.org\/web\/packages\/data.table\/vignettes\/datatable-reshape.html\">vin\u011bt<\/a><\/noindex> k bal\u00ed\u010dku <strong>data.table<\/strong>.<\/p>\n<p><\/p>\n<p>Vytvo\u0159me tr\u00e9ninkov\u00fd datov\u00fd r\u00e1mec.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">rodina &lt;- tibble::tribble(\n  ~rodina,  ~dob_d\u00edt\u011b1,  ~dob_d\u00edt\u011b2, ~pohlav\u00ed_d\u00edt\u011b1, ~pohlav\u00ed_d\u00edt\u011b2,\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)\nrodina % 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>Vytvo\u0159en\u00fd datov\u00fd r\u00e1mec obsahuje v ka\u017ed\u00e9m \u0159\u00e1dku informace o d\u011btech jedn\u00e9 rodiny. V rodin\u00e1ch m\u016f\u017ee b\u00fdt jedno nebo dv\u011b d\u011bti. U ka\u017ed\u00e9ho d\u00edt\u011bte jsou uvedena data o datu narozen\u00ed a pohlav\u00ed, p\u0159i\u010dem\u017e \u00fadaje o ka\u017ed\u00e9m d\u00edt\u011bti jsou v samostatn\u00fdch sloupc\u00edch, na\u0161\u00edm \u00fakolem je p\u0159iv\u00e9st tyto \u00fadaje do spr\u00e1vn\u00e9ho form\u00e1tu pro anal\u00fdzu.<\/p>\n<p><\/p>\n<p>V\u0161imn\u011bte si, \u017ee m\u00e1me dv\u011b prom\u011bnn\u00e9 s informacemi o ka\u017ed\u00e9m d\u00edt\u011bti: jeho pohlav\u00ed a datum narozen\u00ed (sloupce s prefixem <em>dop<\/em> obsahuj\u00ed datum narozen\u00ed, sloupce s prefixem <em>gender<\/em> obsahuj\u00ed pohlav\u00ed d\u00edt\u011bte). V o\u010dek\u00e1van\u00e9m v\u00fdsledku by m\u011bly b\u00fdt v samostatn\u00fdch sloupc\u00edch. M\u016f\u017eeme to ud\u011blat generov\u00e1n\u00edm specifikace, ve kter\u00e9 m\u00e1 sloupec <code>.value<\/code> dv\u011b r\u016fzn\u00e1 hodnoty.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec %\n  pivot_longer_spec(-rodina) %&gt;%\n  separate(col = name, into = c(\".value\", \"d\u00edt\u011b\"))%&gt;%\n  mutate(d\u00edt\u011b = parse_number(d\u00edt\u011b))\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>Tak se poj\u010fme pod\u00edvat na kroky, kter\u00e9 prov\u00e1d\u00ed v\u00fd\u0161e uveden\u00fd k\u00f3d.<\/p>\n<p><\/p>\n<ul>\n<li><code>pivot_longer_spec(-family)<\/code> \u2014 vytv\u00e1\u0159\u00edme specifikaci, kter\u00e1 zhu\u0161\u0165uje v\u0161echny existuj\u00edc\u00ed sloupce krom\u011b sloupce family.<\/li>\n<li><code>separate(col = name, into = c(\".value\", \"d\u00edt\u011b\"))<\/code> \u2014 rozd\u011blujeme sloupec <em>.*.name<\/em>, kter\u00fd obsahuje n\u00e1zvy p\u016fvodn\u00edch pol\u00ed, podle podtr\u017e\u00edtka a vlo\u017e\u00edme z\u00edskan\u00e9 hodnoty do sloupc\u016f <em>.value<\/em> a <em>child<\/em>.<\/li>\n<li><code>mutate(child = parse_number(child))<\/code> \u2014 p\u0159ev\u00e1d\u00edme hodnoty pole <em>child<\/em> z textov\u00e9ho na \u010d\u00edseln\u00fd datov\u00fd typ.<\/li>\n<\/ul>\n<p><\/p>\n<p>Nyn\u00ed m\u016f\u017eeme aplikovat z\u00edskanou specifikaci na p\u016fvodn\u00ed datov\u00fd r\u00e1mec a p\u0159iv\u00e9st tabulku do po\u017eadovan\u00e9ho form\u00e1tu.<\/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>Pou\u017e\u00edv\u00e1me argument <code>na.rm = TRUE<\/code>, proto\u017ee aktu\u00e1ln\u00ed forma dat nut\u00ed vytv\u00e1\u0159et nadbyte\u010dn\u00e9 \u0159\u00e1dky pro neexistuj\u00edc\u00ed pozorov\u00e1n\u00ed. Jeliko\u017e rodina \u010d. 2 m\u00e1 pouze jedno d\u00edt\u011b, <code>na.rm = TRUE<\/code> zaru\u010duje, \u017ee rodina 2 bude m\u00edt jeden \u0159\u00e1dek ve v\u00fdstupu.<\/p>\n<p><\/p>\n<h2 id=\"preobrazovanie-data-freymov-iz-dlinnogo-formata-k-shirokomu\">P\u0159evod datov\u00fdch r\u00e1mc\u016f z dlouh\u00e9ho form\u00e1tu do \u0161irok\u00e9ho<\/h2>\n<p><\/p>\n<p><code>pivot_wider()<\/code> \u2014 je inverzn\u00ed transformac\u00ed a naopak zvy\u0161uje po\u010det sloupc\u016f datov\u00e9ho r\u00e1mce t\u00edm, \u017ee sni\u017euje po\u010det \u0159\u00e1dk\u016f.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"R bal\u00ed\u010dek tidyr a jeho nov\u00e9 funkce pivot_longer a pivot_wider\" src=\"\/wp-content\/uploads\/2020\/04\/b470664e06f362d6f0ea6df9c1ed426d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Takov\u00e9ho druhu transformace se velmi z\u0159\u00eddka pou\u017e\u00edv\u00e1 k uspo\u0159\u00e1d\u00e1n\u00ed dat do \u010dist\u00e9ho form\u00e1tu, nicm\u00e9n\u011b tento p\u0159\u00edstup m\u016f\u017ee b\u00fdt u\u017eite\u010dn\u00fd pro vytv\u00e1\u0159en\u00ed pivotn\u00edch tabulek pou\u017e\u00edvan\u00fdch v prezentac\u00edch nebo pro integraci s jin\u00fdmi n\u00e1stroji.<\/p>\n<p><\/p>\n<p>Ve skute\u010dnosti jsou funkce <code>pivot_longer()<\/code> a <code>pivot_wider()<\/code> symetrick\u00e9 a prov\u00e1d\u011bj\u00ed vz\u00e1jemn\u011b opa\u010dn\u00e9 akce, tj: <code>df %&gt;% pivot_longer(spec = spec) %&gt;% pivot_wider(spec = spec)<\/code> a <code>df %&gt;% pivot_wider(spec = spec) %&gt;% pivot_longer(spec = spec)<\/code> vr\u00e1t\u00ed p\u016fvodn\u00ed df.<\/p>\n<p><\/p>\n<h3 id=\"prosteyshiy-primer-privedeniya-tablicy-k-shirokomu-formatu\">Nejjednodu\u0161\u0161\u00ed p\u0159\u00edklad \u00fapravy tabulky na \u0161irok\u00fd form\u00e1t<\/h3>\n<p><\/p>\n<p>Pro demonstraci funkcionality <code>pivot_wider()<\/code> budeme pou\u017e\u00edvat datovou sadu <em>fish_encounters<\/em>, kter\u00e1 obsahuje informace o tom, jak r\u016fzn\u00e9 stanice zaznamen\u00e1vaj\u00ed pohyb ryb v \u0159ece.<\/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>V drtiv\u00e9 v\u011bt\u0161in\u011b p\u0159\u00edpad\u016f bude tato tabulka informativn\u011bj\u0161\u00ed a u\u017eivatelsky p\u0159\u00edv\u011btiv\u011bj\u0161\u00ed, pokud prezentujeme informace o ka\u017ed\u00e9 stanici v samostatn\u00e9m sloupci.<\/p>\n<p><\/p>\n<p><code>fish_encounters %&gt;% pivot_wider(names_from = station, values_from = seen)<\/code><\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">fish_encounters %&gt;% pivot_wider(names_from = station, values_from = seen)\n#&gt; # A tibble: 19 x 12\n#&gt;    fish  Release I80_1 Lisbon  Rstr Base_TD   BCE   BCW  BCE2  BCW2   MAE\n#&gt;        &amp;        &amp;          \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 s 9 dal\u0161\u00edmi \u0159\u00e1dky a 1 dal\u0161\u00ed prom\u011bnnou: MAW<\/code><\/pre>\n<p><\/p>\n<p>Tato datov\u00e1 sada zaznamen\u00e1v\u00e1 informace pouze v p\u0159\u00edpadech, kdy byla ryba nalezena stanic\u00ed, tj. pokud nebyla \u017e\u00e1dn\u00e1 ryba zachycena n\u011bkterou stanic\u00ed, pak tyto \u00fadaje v tabulce nebudou. To znamen\u00e1, \u017ee v\u00fdstupn\u00ed data budou vypln\u011bna NA. <\/p>\n<p><\/p>\n<p>Nicm\u00e9n\u011b v tomto p\u0159\u00edpad\u011b v\u00edme, \u017ee absence z\u00e1znamu znamen\u00e1, \u017ee ryba nebyla zaznamen\u00e1na, tak\u017ee m\u016f\u017eeme pou\u017e\u00edt argument <em>values_fill<\/em> ve funkci <code>pivot_wider()<\/code> a vyplnit tyto chyb\u011bj\u00edc\u00ed hodnoty nulami:<\/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\">Generov\u00e1n\u00ed n\u00e1zvu sloupce z n\u011bkolika p\u016fvodn\u00edch prom\u011bnn\u00fdch<\/h3>\n<p><\/p>\n<p>P\u0159edstavte si, \u017ee m\u00e1me tabulku, kter\u00e1 obsahuje kombinaci produktu, zem\u011b a roku. Abychom vygenerovali testovac\u00ed datov\u00fd r\u00e1mec, m\u016f\u017eeme prov\u00e9st n\u00e1sleduj\u00edc\u00ed k\u00f3d:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">df %\n  filter((produkt == \"A\" &amp; zem\u011b == \"AI\") | produkt == \"B\") %&gt;% \n  mutate(hodnota = 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>Na\u0161\u00edm \u00fakolem je roz\u0161\u00ed\u0159it datov\u00fd r\u00e1mec tak, aby jeden sloupec obsahoval data pro ka\u017edou kombinaci produktu a zem\u011b. K tomu sta\u010d\u00ed p\u0159edat do argumentu <em>names_from<\/em> vektor, kter\u00fd obsahuje n\u00e1zvy slu\u010dovan\u00fdch pol\u00ed.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">df %&gt;% pivot_wider(names_from = c(produkt, zem\u011b),\n                 values_from = \"hodnota\")<\/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>M\u016f\u017eete tak\u00e9 pou\u017e\u00edt specifikace pro funkci <code>pivot_wider()<\/code>. Ale p\u0159i pod\u00e1n\u00ed do <code>pivot_wider()<\/code> specifikace prov\u00e1d\u00ed p\u0159em\u011bnu, kter\u00e1 je opa\u010dn\u00e1 <code>pivot_longer()<\/code>: vytv\u00e1\u0159ej\u00ed se sloupce, kter\u00e9 jsou uvedeny v <em>.*.name<\/em>, pomoc\u00ed hodnot z <em>.value<\/em> a dal\u0161\u00edch sloupc\u016f.<\/p>\n<p><\/p>\n<p>Pro tuto datovou sadu m\u016f\u017eete vygenerovat vlastn\u00ed specifikaci, pokud chcete, aby ka\u017ed\u00e1 mo\u017en\u00e1 kombinace zem\u011b a produktu m\u011bla sv\u016fj vlastn\u00ed sloupec, a ne pouze ty, kter\u00e9 jsou v datech:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec % \n  expand(produkt, zem\u011b, .value = \"hodnota\") %&gt;% \n  unite(\".name\", produkt, zem\u011b, 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\">N\u011bkolik pokro\u010dil\u00fdch p\u0159\u00edklad\u016f pr\u00e1ce s nov\u00fdm konceptem 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\">\u00daprava dat do p\u0159ehledn\u00e9ho form\u00e1tu na p\u0159\u00edkladu souboru dat o p\u0159\u00edjmech a n\u00e1jemn\u00e9m v USA<\/h3>\n<p><\/p>\n<p>Datov\u00fd soubor <em>us_rent_income<\/em> obsahuje informace o pr\u016fm\u011brn\u00e9m p\u0159\u00edjmu a n\u00e1jmu pro ka\u017ed\u00fd st\u00e1t v USA za rok 2017 (datov\u00fd soubor je k dispozici v bal\u00ed\u010dku <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 s 94 dal\u0161\u00edmi \u0159\u00e1dky<\/code><\/pre>\n<p><\/p>\n<p>V jak\u00e9m form\u00e1tu jsou data ve datasetu <em>us_rent_income<\/em> pracovat s nimi je velmi nepohodln\u00e9, proto bychom cht\u011bli vytvo\u0159it datov\u00fd soubor se sloupci: <em>rent<\/em>, <em>rent_moe<\/em>, <em>come<\/em>, <em>income_moe<\/em>. Existuje mnoho zp\u016fsob\u016f, jak vytvo\u0159it tuto specifikaci, ale hlavn\u00ed je, \u017ee mus\u00edme vygenerovat ka\u017edou kombinaci hodnot prom\u011bnn\u00e9 a <em>estimate\/moe<\/em>, a pot\u00e9 vygenerovat n\u00e1zev sloupce.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">  spec % \n    expand(variable, .value = c(\"odhad\", \"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>Poskytnut\u00ed t\u00e9to specifikace <code>pivot_wider()<\/code> n\u00e1m d\u00e1v\u00e1 v\u00fdsledek, kter\u00fd hled\u00e1me:<\/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\">Sv\u011btov\u00e1 banka<\/h3>\n<p><\/p>\n<p>N\u011bkdy vy\u017eaduje p\u0159iveden\u00ed datov\u00e9ho souboru do spr\u00e1vn\u00e9 podoby n\u011bkolik krok\u016f.<br \/>\nDatov\u00fd soubor <em>world_bank_pop<\/em> obsahuje \u00fadaje Sv\u011btov\u00e9 banky o populaci ka\u017ed\u00e9 zem\u011b v obdob\u00ed od roku 2000 do roku 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>Na\u0161\u00edm c\u00edlem je vytvo\u0159it p\u0159ehledn\u00fd datov\u00fd soubor, kde ka\u017ed\u00e1 prom\u011bnn\u00e1 je v samostatn\u00e9m sloupci. Zat\u00edm nen\u00ed jasn\u00e9, jak\u00e9 konkr\u00e9tn\u00ed kroky jsou pot\u0159eba, ale za\u010dneme s nejz\u0159ejm\u011bj\u0161\u00edm probl\u00e9mem: rok je rozlo\u017een do n\u011bkolika sloupc\u016f.<\/p>\n<p><\/p>\n<p>Abychom to opravili, je t\u0159eba pou\u017e\u00edt funkci <code>pivot_longer()<\/code>.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">pop2 % \n  pivot_longer(`2000`:`2017`, names_to = \"rok\")<\/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>Dal\u0161\u00edm krokem je zv\u00e1\u017eit prom\u011bnnou 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>Kde SP.POP.GROW je r\u016fst populace, SP.POP.TOTL je celkov\u00fd po\u010det obyvatel a SP.URB. * je tot\u00e9\u017e, ale pouze pro m\u011bstsk\u00e9 oblasti. Rozd\u011blme tyto hodnoty na dv\u011b prom\u011bnn\u00e9: area \u2014 lokalita (total nebo urban) a prom\u011bnnou obsahuj\u00edc\u00ed skute\u010dn\u00e9 \u00fadaje (population nebo growth):<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">pop3 % \n  separate(indicator, c(NA, \"oblast\", \"prom\u011bnn\u00e1\"))<\/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>Nyn\u00ed zb\u00fdv\u00e1 pouze rozd\u011blit prom\u011bnnou variable na dva sloupce:<\/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\">Seznam kontakt\u016f<\/h3>\n<p><\/p>\n<p>Posledn\u00ed p\u0159\u00edklad, p\u0159edstavte si, \u017ee m\u00e1te seznam kontakt\u016f, kter\u00fd jste zkop\u00edrovali a vlo\u017eili z webov\u00fdch str\u00e1nek:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">kontakty &lt;- tribble(\n  ~pole, ~hodnota,\n  &quot;jm\u00e9no&quot;, &quot;Jiena McLellan&quot;,\n  &quot;firma&quot;, &quot;Toyota&quot;, \n  &quot;jm\u00e9no&quot;, &quot;John Smith&quot;, \n  &quot;firma&quot;, &quot;google&quot;, \n  &quot;email&quot;, &quot;john@google.com&quot;,\n  &quot;jm\u00e9no&quot;, &quot;Huxley Ratcliffe&quot;\n)<\/code><\/pre>\n<p><\/p>\n<p>P\u0159ev\u00e9st tento seznam do tabulkov\u00e9ho form\u00e1tu je pom\u011brn\u011b slo\u017eit\u00e9, proto\u017ee neexistuje prom\u011bnn\u00e1, kter\u00e1 by identifikovala, kter\u00e9 \u00fadaje pat\u0159\u00ed kter\u00e9mu kontaktu. M\u016f\u017eeme to opravit tak, \u017ee si v\u0161imneme, \u017ee \u00fadaje pro ka\u017ed\u00e9ho nov\u00e9ho kontaktu za\u010d\u00ednaj\u00ed jm\u00e9nem (\"name\"), tak\u017ee m\u016f\u017eeme vytvo\u0159it unik\u00e1tn\u00ed identifik\u00e1tor a zvy\u0161ovat ho o jeden poka\u017ed\u00e9, kdy\u017e se ve sloupci field objev\u00ed hodnota \"name\":<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">contacts % \n  mutate(\n    person_id = cumsum(field == \"name\")\n  )\ncontacts<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 6 x 3\n#&gt;   field   value            person_id\n#&gt;   &lt;chr&gt;   &lt;chr&gt;                &lt;int&gt;\n#&gt; 1 name    Jiena McLellan           1\n#&gt; 2 company Toyota                   1\n#&gt; 3 name    John Smith               2\n#&gt; 4 company google                   2\n#&gt; 5 email   john@google.com          2\n#&gt; 6 name    Huxley Ratcliffe         3<\/code><\/pre>\n<p><\/p>\n<p>Nyn\u00ed, kdy\u017e m\u00e1me jedine\u010dn\u00fd identifik\u00e1tor pro ka\u017ed\u00e9ho kontaktu, m\u016f\u017eeme oto\u010dit pole a hodnotu do sloupc\u016f:<\/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\">Z\u00e1v\u011br<\/h2>\n<p><\/p>\n<p>Osobn\u011b si mysl\u00edm, \u017ee nov\u00fd koncept <strong>tidyr<\/strong> je opravdu intuitivn\u011b srozumiteln\u011bj\u0161\u00ed a v\u00fdrazn\u011b p\u0159evy\u0161uje ve funkcionalit\u011b zastaral\u00e9 funkce. <code>spread()<\/code> a <code>gather()<\/code>Douf\u00e1m, \u017ee v\u00e1m tento \u010dl\u00e1nek pomohl pochopit <code>pivot_longer()<\/code> a <code>pivot_wider()<\/code>.<\/p>\n<p>Zdroj: <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\/cs\/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=\"cs_CZ\" \/>\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\/cs\/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 bal\u00ed\u010dek tidyr a jeho nov\u00e9 funkce pivot_longer a pivot_wider | ProHoster","description":"Bal\u00ed\u010dek tidyr je sou\u010d\u00e1st\u00ed jedn\u00e9 z nejpopul\u00e1rn\u011bj\u0161\u00edch knihoven v jazyce R \u2014 tidyverse. Hlavn\u00edm c\u00edlem bal\u00ed\u010dku je \u00faprava dat do p\u0159ehledn\u00e9ho form\u00e1tu. Na Habru.","canonical_url":"https:\/\/prohoster.info\/cs\/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":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/76291","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=76291"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/76291\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/76292"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=76291"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=76291"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=76291"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}