{"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\/de\/blog\/administrirovanie\/r-paket-tidyr-i-ego-novye-funkczii-pivot_longer-i-pivot_wider","title":{"rendered":"R-Paket tidyr und seine neuen Funktionen pivot_longer und pivot_wider","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Das Paket <strong>tidyr<\/strong> ist Teil eines der beliebtesten Bibliotheken in der Programmiersprache R \u2014 <strong>tidyverse<\/strong>.<br \/>\nDie Hauptfunktion des Pakets besteht darin, Daten in eine aufger\u00e4umte Form zu bringen.<\/p>\n<p><\/p>\n<p>Im Habr gibt es bereits <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/248741\/\">Ver\u00f6ffentlichung<\/a><\/noindex> die diesem Paket gewidmet ist, aber auf das Jahr 2015 datiert. Ich m\u00f6chte \u00fcber die aktuellsten \u00c4nderungen berichten, die vor einigen Tagen von seinem Autor Hadley Wickham angek\u00fcndigt wurden.<\/p>\n<p>\n<img decoding=\"async\" alt=\"R-Paket tidyr und seine neuen Funktionen pivot_longer und pivot_wider\" src=\"\/wp-content\/uploads\/2020\/04\/a290263b63aaea3db70e83a1ec411415.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<blockquote><p><b>SJK<\/b>: Werden die Funktionen gather() und spread() als veraltet angesehen?<\/p>\n<p><b>Hadley Wickham<\/b>: In gewissem Ma\u00dfe. Wir werden die Verwendung dieser Funktionen nicht mehr empfehlen und keine Fehler mehr beheben, aber sie werden weiterhin im Paket im aktuellen Zustand vorhanden sein.<\/p><\/blockquote>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"soderzhanie\">Inhalt<\/h2>\n<p><\/p>\n<p><em>Falls Sie sich f\u00fcr Datenanalyse interessieren, k\u00f6nnten meine <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/R4marketing\">telegram<\/a><\/noindex> und <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/R4marketing\/?sub_confirmation=1\">youtube<\/a><\/noindex> Kan\u00e4le gefallen. Der Gro\u00dfteil des Inhalts ist der Sprache R gewidmet.<\/em><\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"#koncepciya-tidydata\">Das Konzept von TidyData<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#osnovnye-funkcii-vhodyaschie-v-paket-tydir\">Die Hauptfunktionen, die im Paket tidyr enthalten sind<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#novaya-koncepciya-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy-i-naoborot\">Ein neues Konzept zur Umwandlung von Daten aus einem breiten Format in ein langes und umgekehrt<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/ustnovka-naibolee-aktualnoy-versii-tidyr-0839000\">Installation der aktuellsten Version von tidyr 0.8.3.9000<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#perehod-na-novye-funkcii\">\u00dcbergang zu neuen Funktionen<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#prostoy-primer-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy\">Ein einfaches Beispiel zur Umwandlung von Daten aus einem breiten Format in ein langes<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#specifikacii\">Spezifikationen<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#specifikaciya-s-ispolzovaniem-neskolkih-znacheniyvalue\">Spezifikation mit mehreren Werten (.value)<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#preobrazovanie-data-freymov-iz-dlinnogo-formata-k-shirokomu\">Umwandlung von Data Frames vom langen Format in das breite Format<\/a><\/noindex>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"#prosteyshiy-primer-privedeniya-tablicy-k-shirokomu-formatu\">Ein einfaches Beispiel zur Umwandlung einer Tabelle in ein breites Format<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#generaciya-imeni-stolbca-iz-neskolkih-ishodnyh-peremennyh\">Generierung eines Spaltennamens aus mehreren Ausgangsvariablen<\/a><\/noindex><\/li>\n<\/ul>\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#neskolko-prodvinutyh-primerov-raboty-s-novoy-koncepciey-tidyr\">Einige fortgeschrittene Beispiele f\u00fcr die Arbeit mit dem neuen Konzept von 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\">Daten in ein ordentliches Format bringen am Beispiel des Datensatzes zur Einkommens- und Mietsch\u00e4tzung in den USA<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#vsemirnyy-bank\">Weltbank<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#spisok-kontaktov\">Kontakliste<\/a><\/noindex><\/li>\n<\/ul>\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#zaklyuchenie\">Fazit<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"koncepciya-tidydata\">Das Konzept von TidyData<\/h2>\n<p><\/p>\n<p>Ziel <strong>tidyr<\/strong> \u2014 helfen Ihnen, Ihre Daten in das sogenannte ordentliche Format zu bringen. Ordentliche Daten sind Daten, bei denen: <\/p>\n<p><\/p>\n<ul>\n<li>Jede Variable sich in einer Spalte befindet. <\/li>\n<li>Jede Beobachtung eine Zeile ist. <\/li>\n<li>Jeder Wert eine Zelle ist.<\/li>\n<\/ul>\n<p><\/p>\n<p>Mit ordentlichen Daten l\u00e4sst sich wesentlich einfacher und bequemer arbeiten, wenn es um Analysen geht.<\/p>\n<p><\/p>\n<h2 id=\"osnovnye-funkcii-vhodyaschie-v-paket-tidyr\">Die Hauptfunktionen, die im Paket tidyr enthalten sind<\/h2>\n<p><\/p>\n<p>tidyr enth\u00e4lt eine Reihe von Funktionen, die zur Transformation von Tabellen dienen:<\/p>\n<p><\/p>\n<ul>\n<li><code>fill()<\/code> \u2014 f\u00fcllt fehlende Werte in einer Spalte mit den vorherigen Werten auf;<\/li>\n<li><code>separate()<\/code> \u2014 teilt ein Feld in mehrere Teile durch einen Trennzeichen;<\/li>\n<li><code>unite()<\/code> \u2014 f\u00fchrt die Operation zusammen, mehrere Felder in eines, was das Gegenteil der Funktion ist <code>separate()<\/code>;<\/li>\n<li><code>pivot_longer()<\/code> \u2014 Funktion, die Daten von einem breiten Format in ein langes transformiert;<\/li>\n<li><code>pivot_wider()<\/code> \u2014 Funktion, die Daten von einem langen Format in ein breites umwandelt. Die R\u00fcckoperation von dem, was die Funktion <code>pivot_longer()<\/code>.<\/li>\n<li><code>gather()<\/code><strong>obsolet<\/strong> \u2014 Funktion, die Daten von einem breiten Format in ein langes transformiert;<\/li>\n<li><code>spread()<\/code><strong>obsolet<\/strong> \u2014 Funktion, die Daten von einem langen Format in ein breites umwandelt. Die R\u00fcckoperation von dem, was die Funktion <code>gather()<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"novaya-koncepciya-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy-i-naoborot\">Ein neues Konzept zur Umwandlung von Daten aus einem breiten Format in ein langes und umgekehrt<\/h2>\n<p><\/p>\n<p>Fr\u00fcher wurden Funktionen f\u00fcr derartige Transformationen verwendet <code>gather()<\/code> und <code>spread()<\/code>. Im Laufe der Jahre ist klar geworden, dass die Namen dieser Funktionen und ihrer Argumente f\u00fcr die meisten Benutzer, einschlie\u00dflich des Paketautors, nicht intuitiv waren und das Finden sowie das Verst\u00e4ndnis, welche dieser Funktionen einen Data Frame von einem breiten in ein langes Format und umgekehrt bringt, erschwerten.<\/p>\n<p><\/p>\n<p>Daher wurden <strong>tidyr<\/strong> zwei neue, wichtige Funktionen hinzugef\u00fcgt, die zur Transformation von Data Frames gedacht sind.<\/p>\n<p><\/p>\n<p>Neue Funktionen <code>pivot_longer()<\/code> und <code>pivot_wider()<\/code> Sie wurden inspiriert von einigen Funktionen aus dem Paket <strong>cdata<\/strong>, das von John Mount und Nina Zumel entwickelt wurde.<\/p>\n<p><\/p>\n<h3 id=\"ustanovka-naibolee-aktualnoy-versii-tidyr-0839000\">Installation der aktuellsten Version von tidyr 0.8.3.9000<\/h3>\n<p><\/p>\n<p>Um die neue, aktuellste Version des Pakets <strong>tidyr<\/strong> <em>0.8.3.9000<\/em>, in dem die neuen Funktionen verf\u00fcgbar sind, zu installieren, verwenden Sie den folgenden Code.<\/p>\n<p><\/p>\n<p><code>devtools::install_github(\"tidyverse\/tidyr\")<\/code><\/p>\n<p><\/p>\n<p>Zum Zeitpunkt der Erstellung dieses Artikels sind diese Funktionen nur in der Dev-Version des Pakets auf GitHub verf\u00fcgbar.<\/p>\n<p><\/p>\n<h3 id=\"perehod-na-novye-funkcii\">\u00dcbergang zu neuen Funktionen<\/h3>\n<p><\/p>\n<p>In der Tat ist es nicht schwierig, alte Skripte auf die neuen Funktionen umzustellen; um dies besser zu verstehen, werde ich ein Beispiel aus der Dokumentation der alten Funktionen verwenden und zeigen, wie dieselben Operationen mit den neuen <code>pivot_*()<\/code> Funktionen ausgef\u00fchrt werden.<\/p>\n<p><\/p>\n<p>Transformation von breitem Format in langes.<\/p>\n<p>\n<b class=\"spoiler_title\">Beispielcode aus der Dokumentation der Funktion 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>Umwandlung von Long-Format in Wide-Format.<\/p>\n<p>\n<b class=\"spoiler_title\">Codebeispiel aus der Dokumentation der Funktion 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 in den obigen Beispielen mit <code>pivot_longer()<\/code> und <code>pivot_wider()<\/code>keine der in den Argumenten <em>stocks<\/em> aufgef\u00fchrten Spalten in der urspr\u00fcnglichen Tabelle vorhanden sind, <em>names_to<\/em> und <em>values_to<\/em> m\u00fcssen deren Namen in Anf\u00fchrungszeichen angegeben werden.<\/p>\n<p><\/p>\n<p>Eine Tabelle, die Ihnen am einfachsten helfen wird, die Umstellung auf das neue Konzept zu verstehen. <strong>tidyr<\/strong>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"R-Paket tidyr und seine neuen Funktionen pivot_longer und 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\">Anmerkung des Autors<\/h2>\n<p><\/p>\n<blockquote><p>Der gesamte folgende Text ist adaptiv, ich w\u00fcrde sogar sagen, eine freiere \u00dcbersetzung <noindex><a rel=\"nofollow\" href=\"https:\/\/tidyr.tidyverse.org\/dev\/articles\/pivot.html\">Vignetten<\/a><\/noindex> von der offiziellen Website der Bibliothek tidyverse.<\/p><\/blockquote>\n<p><\/p>\n<h2 id=\"prostoy-primer-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy\">Ein einfaches Beispiel zur Umwandlung von Daten aus einem breiten Format in ein langes<\/h2>\n<p><\/p>\n<p><code>pivot_longer()<\/code> macht Datens\u00e4tze l\u00e4nger, indem sie die Anzahl der Spalten reduziert und die Anzahl der Zeilen erh\u00f6ht.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"R-Paket tidyr und seine neuen Funktionen pivot_longer und pivot_wider\" src=\"\/wp-content\/uploads\/2020\/04\/fc88b99f2fecdcdaa6179d2e7d29e59d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Um die in dem Artikel dargestellten Beispiele auszuf\u00fchren, m\u00fcssen zun\u00e4chst die erforderlichen Pakete geladen werden:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">library(tidyr)\nlibrary(dplyr)\nlibrary(readr)<\/code><\/pre>\n<p><\/p>\n<p>Angenommen, wir haben eine Tabelle mit den Ergebnissen einer Umfrage, in der (unter anderem) die Menschen nach ihrer Religion und ihrem Jahreseinkommen gefragt wurden:<\/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>Diese Tabelle enth\u00e4lt Daten zur Religion der Befragten in den Zeilen, w\u00e4hrend das Einkommen \u00fcber die Spaltennamen verteilt ist. Die Anzahl der Befragten in jeder Kategorie wird in den Zellen angezeigt, wo Religion und Einkommensniveau sich kreuzen. Um die Tabelle in ein ordentliches, korrektes Format zu bringen, gen\u00fcgt es, <code>pivot_longer()<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">pew %&gt;% \n  pivot_longer(cols = -religion, names_to = \"income\", values_to = \"count\")<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">pew %&gt;% \n  pivot_longer(cols = -religion, names_to = \"income\", values_to = \"count\")\n#&gt; # Ein Tibble: 180 x 3\n#&gt;    religion income             count\n#&gt;                      \n#&gt;  1 Agnostiker &lt;$10k                 27\n#&gt;  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 Wei\u00df nicht\/abgelehnt    96\n#&gt; # \u2026 mit 170 weiteren Zeilen<\/code><\/pre>\n<p><\/p>\n<p>Funktionsargumente <code>pivot_longer()<\/code><\/p>\n<p><\/p>\n<ul>\n<li>Erstes Argument <em>cols<\/em>, beschreibt, welche Spalten zusammengef\u00fchrt werden m\u00fcssen. In diesem Fall sind es alle Spalten au\u00dfer <em>time<\/em>.<\/li>\n<li>Das Argument <em>names_to<\/em> gibt den Namen der Variable an, die aus den zusammengef\u00fchrten Spaltennamen erstellt wird.<\/li>\n<li><em>values_to<\/em> gibt den Namen der Variablen an, die aus den in den Werten der zusammengef\u00fchrten Spalten gespeicherten Daten erstellt wird.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"specifikacii\">Spezifikationen<\/h2>\n<p><\/p>\n<p>Dies ist eine neue Funktion des Pakets <strong>tidyr<\/strong>, der zuvor bei der Verwendung veralteter Funktionen nicht verf\u00fcgbar war.<\/p>\n<p><\/p>\n<p>Die Spezifikation ist ein Datenrahmen, wobei jede Zeile einer Spalte im neuen Ausgangs-Datenrahmen entspricht und zwei spezielle Spalten aufweist, die mit . beginnen: <\/p>\n<p><\/p>\n<ul>\n<li><em>.name<\/em> enth\u00e4lt den urspr\u00fcnglichen Spaltennamen. <\/li>\n<li><em>.value<\/em> enth\u00e4lt den Namen der Spalte, in die die Zellwerte eingegeben werden. <\/li>\n<\/ul>\n<p><\/p>\n<p>Die \u00fcbrigen Spalten der Spezifikation spiegeln wider, wie der Name der komprimierten Spalten im neuen Spaltenausdruck ausgegeben wird. <em>.name<\/em>.<\/p>\n<p><\/p>\n<p>Die Spezifikation beschreibt die Metadaten, die im Spaltennamen gespeichert werden, mit einer Zeile f\u00fcr jede Spalte und einer Spalte f\u00fcr jede Variable, die mit dem Spaltennamen verbunden ist. Vielleicht erscheint diese Definition jetzt verwirrend, aber nach der Betrachtung mehrerer Beispiele wird alles viel klarer.<\/p>\n<p><\/p>\n<p>Der Zweck der Spezifikation besteht darin, dass Sie Metadaten aus dem zu verwandelnden Datenrahmen extrahieren, \u00e4ndern und festlegen k\u00f6nnen.<\/p>\n<p><\/p>\n<p>F\u00fcr die Arbeit mit Spezifikationen beim Konvertieren von einer breiten zu einer langen Tabelle dient die Funktion <code>pivot_longer_spec()<\/code>.<\/p>\n<p><\/p>\n<p>Wie diese Funktion funktioniert, sie nimmt einen beliebigen Data Frame und erstellt seine Metadaten auf die oben beschriebene Weise. <\/p>\n<p><\/p>\n<p>Zum Beispiel nehmen wir den Datensatz 'who', der zusammen mit dem Paket bereitgestellt wird. <strong>tidyr<\/strong>Dieser Datensatz enth\u00e4lt Informationen, die von der internationalen Gesundheitsorganisation \u00fcber die Tuberkuloserkrankungen bereitgestellt werden.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">who\n#&gt; # A tibble: 7,240 x 60\n#&gt;    country iso2  iso3   year new_sp_m014 new_sp_m1524 new_sp_m2534\n#&gt;        &amp;                        \n#&gt;  1 Afghan\u2026 AF    AFG    1980          NA           NA           NA\n#&gt;  2 Afghan\u2026 AF    AFG    1981          NA           NA           NA\n#&gt;  3 Afghan\u2026 AF    AFG    1982          NA           NA           NA\n#&gt;  4 Afghan\u2026 AF    AFG    1983          NA           NA           NA\n#&gt;  5 Afghan\u2026 AF    AFG    1984          NA           NA           NA\n#&gt;  6 Afghan\u2026 AF    AFG    1985          NA           NA           NA\n#&gt;  7 Afghan\u2026 AF    AFG    1986          NA           NA           NA\n#&gt;  8 Afghan\u2026 AF    AFG    1987          NA           NA           NA\n#&gt;  9 Afghan\u2026 AF    AFG    1988          NA           NA           NA\n#&gt; 10 Afghan\u2026 AF    AFG    1989          NA           NA           NA\n#&gt; # \u2026 mit 7.230 weiteren Zeilen und 53 weiteren Variablen<\/code><\/pre>\n<p><\/p>\n<p>Lassen Sie uns seine Spezifikation erstellen.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec %\n  pivot_longer_spec(new_sp_m014:newrel_f65, values_to = \"count\")<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 56 x 3\n#&gt;    .name        .value name        \n#&gt;    &lt;chr&gt;        &lt;chr&gt;  &lt;chr&gt;       \n#&gt;  1 new_sp_m014  count  new_sp_m014 \n#&gt;  2 new_sp_m1524 count  new_sp_m1524\n#&gt;  3 new_sp_m2534 count  new_sp_m2534\n#&gt;  4 new_sp_m3544 count  new_sp_m3544\n#&gt;  5 new_sp_m4554 count  new_sp_m4554\n#&gt;  6 new_sp_m5564 count  new_sp_m5564\n#&gt;  7 new_sp_m65   count  new_sp_m65  \n#&gt;  8 new_sp_f014  count  new_sp_f014 \n#&gt;  9 new_sp_f1524 count  new_sp_f1524\n#&gt; 10 new_sp_f2534 count  new_sp_f2534\n#&gt; # \u2026 with 46 more rows<\/code><\/pre>\n<p><\/p>\n<p>Felder <em>country<\/em>, <em>iso2<\/em>, <em>iso3<\/em> sind bereits Variablen. Unsere Aufgabe ist es, die Spalten mit <em>new_sp_m014<\/em> zum <em>newrel_f65<\/em>.<\/p>\n<p><\/p>\n<p>In den Spalten\u00fcberschriften sind folgende Informationen gespeichert:<\/p>\n<p><\/p>\n<ul>\n<li>Pr\u00e4fix <code>new_<\/code> deutet darauf hin, dass die Spalte Daten \u00fcber neue Tuberkulosef\u00e4lle enth\u00e4lt; der aktuelle Datensatz enth\u00e4lt Informationen nur zu neuen Erkrankungen, daher hat dieses Pr\u00e4fix in diesem Kontext keine semantische Bedeutung.<\/li>\n<li><code>sp<\/code>\/<code>rel<\/code>\/<code>sp<\/code>\/<code>ep<\/code> beschreibt die Methode zur Diagnose der Krankheit.<\/li>\n<li><code>m<\/code>\/<code>f<\/code> Geschlecht des Patienten.<\/li>\n<li><code>014<\/code>\/<code>1524<\/code>\/<code>2535<\/code>\/<code>3544<\/code>\/<code>4554<\/code>\/<code>65<\/code> Altersspanne des Patienten.<\/li>\n<\/ul>\n<p><\/p>\n<p>Wir k\u00f6nnen diese Spalten mit der Funktion <code>extract()<\/code>, unter Verwendung eines regul\u00e4ren Ausdrucks, aufteilen.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec %\n        extract(name, c(\"diagnosis\", \"gender\", \"age\"), \"new_?(.*)_(.)(.*)\")<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 56 x 5\n#&gt;    .name        .value diagnosis gender age  \n#&gt;    &lt;chr&gt;        &lt;chr&gt;  &lt;chr&gt;     &lt;chr&gt;  &lt;chr&gt;\n#&gt;  1 new_sp_m014  count  sp        m      014  \n#&gt;  2 new_sp_m1524 count  sp        m      1524 \n#&gt;  3 new_sp_m2534 count  sp        m      2534 \n#&gt;  4 new_sp_m3544 count  sp        m      3544 \n#&gt;  5 new_sp_m4554 count  sp        m      4554 \n#&gt;  6 new_sp_m5564 count  sp        m      5564 \n#&gt;  7 new_sp_m65   count  sp        m      65   \n#&gt;  8 new_sp_f014  count  sp        f      014  \n#&gt;  9 new_sp_f1524 count  sp        f      1524 \n#&gt; 10 new_sp_f2534 count  sp        f      2534 \n#&gt; # \u2026 with 46 more rows<\/code><\/pre>\n<p><\/p>\n<p>Bitte beachten Sie, dass die Spalte <em>.name<\/em> unver\u00e4ndert bleiben muss, da dies unser Index in den Spaltennamen des urspr\u00fcnglichen Datensatzes ist. <\/p>\n<p><\/p>\n<p>Geschlecht und Alter (Spalten <em>gender<\/em> und <em>age<\/em>) haben feste und bekannte Werte, daher wird empfohlen, diese Spalten in Faktoren umzuwandeln:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec %\n            mutate(\n              gender = factor(gender, levels = c(\"f\", \"m\")),\n              age = factor(age, levels = unique(age), ordered = TRUE)\n            ) <\/code><\/pre>\n<p><\/p>\n<p>Schlie\u00dflich m\u00fcssen wir, um die von uns erstellte Spezifikation auf den urspr\u00fcnglichen Datensatz anzuwenden, <em>who<\/em> das Argument verwenden <em>spec<\/em> in der Funktion <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>Alles, was wir gerade getan haben, kann schematisch wie folgt dargestellt werden:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"R-Paket tidyr und seine neuen Funktionen pivot_longer und 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\">Spezifikation mit mehreren Werten (.value)<\/h2>\n<p><\/p>\n<p>Im obigen Beispiel enthielt die Spezifikationsspalte <em>.value<\/em> nur einen Wert, was in den meisten F\u00e4llen auch so ist. <\/p>\n<p><\/p>\n<p>Aber gelegentlich kann eine Situation auftreten, in der Sie Daten aus Spalten mit unterschiedlichen Datentypen sammeln m\u00fcssen. Mit einer veralteten Funktion <code>spread()<\/code> w\u00e4re das ziemlich schwierig umzusetzen.<\/p>\n<p><\/p>\n<p>Das folgende Beispiel ist entnommen aus <noindex><a rel=\"nofollow\" href=\"https:\/\/cran.r-project.org\/web\/packages\/data.table\/vignettes\/datatable-reshape.html\">Vignetten<\/a><\/noindex> dem Paket <strong>data.table<\/strong>.<\/p>\n<p><\/p>\n<p>Lassen Sie uns einen Trainingsdatenrahmen erstellen.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">family &lt;- tibble::tribble(\n  ~family,  ~dob_child1,  ~dob_child2, ~gender_child1, ~gender_child2,\n       1L, &quot;1998-11-26&quot;, &quot;2000-01-29&quot;,             1L,             2L,\n       2L, &quot;1996-06-22&quot;,           NA,             2L,             NA,\n       3L, &quot;2002-07-11&quot;, &quot;2004-04-05&quot;,             2L,             2L,\n       4L, &quot;2004-10-10&quot;, &quot;2009-08-27&quot;,             1L,             1L,\n       5L, &quot;2000-12-05&quot;, &quot;2005-02-28&quot;,             2L,             1L,\n)\nfamily % mutate_at(vars(starts_with(\"dob\")), parse_date)<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 5 x 5\n#&gt;   family dob_child1 dob_child2 gender_child1 gender_child2\n#&gt;    &lt;int&gt; &lt;date&gt;     &lt;date&gt;             &lt;int&gt;         &lt;int&gt;\n#&gt; 1      1 1998-11-26 2000-01-29             1             2\n#&gt; 2      2 1996-06-22 NA                     2            NA\n#&gt; 3      3 2002-07-11 2004-04-05             2             2\n#&gt; 4      4 2004-10-10 2009-08-27             1             1\n#&gt; 5      5 2000-12-05 2005-02-28             2             1<\/code><\/pre>\n<p><\/p>\n<p>Der erstellte Datenrahmen enth\u00e4lt in jeder Zeile Daten \u00fcber die Kinder einer Familie. In den Familien kann es ein oder zwei Kinder geben. F\u00fcr jedes Kind werden Geburtsdatum und Geschlecht bereitgestellt, wobei die Daten f\u00fcr jedes Kind in separaten Spalten zusammengestellt sind. Unsere Aufgabe besteht darin, diese Daten in das richtige Format f\u00fcr die Analyse zu bringen.<\/p>\n<p><\/p>\n<p>Bitte beachten Sie, dass wir zwei Variablen mit Informationen \u00fcber jedes Kind haben: sein Geschlecht und sein Geburtsdatum (Spalten mit dem Pr\u00e4fix <em>dop<\/em> enthalten das Geburtsdatum, die Spalten mit dem Pr\u00e4fix <em>gender<\/em> enthalten das Geschlecht des Kindes). Im erwarteten Ergebnis sollten sie in separaten Spalten stehen. Wir k\u00f6nnen dies erreichen, indem wir eine Spezifikation generieren, in der die Spalte <code>.value<\/code> zwei unterschiedliche Werte haben wird.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec %\n  pivot_longer_spec(-family) %&gt;%\n  separate(col = name, into = c(\".value\", \"child\")) %&gt;%\n  mutate(child = parse_number(child))\n<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 4 x 3\n#&gt;   .name         .value child\n#&gt;   &lt;chr&gt;         &lt;chr&gt;  &lt;dbl&gt;\n#&gt; 1 dob_child1    dob        1\n#&gt; 2 dob_child2    dob        2\n#&gt; 3 gender_child1 gender     1\n#&gt; 4 gender_child2 gender     2<\/code><\/pre>\n<p><\/p>\n<p>Lassen Sie uns also die Schritte durchgehen, die der obige Code ausf\u00fchrt.<\/p>\n<p><\/p>\n<ul>\n<li><code>pivot_longer_spec(-family)<\/code> \u2014 wir erstellen eine Spezifikation, die alle vorhandenen Spalten au\u00dfer der Spalte family komprimiert.<\/li>\n<li><code>separate(col = name, into = c(\".value\", \"child\"))<\/code> \u2014 wir trennen die Spalte <em>.name<\/em>, die die Namen der urspr\u00fcnglichen Felder enth\u00e4lt, nach Unterstrichen und tragen die erhaltenen Werte in die Spalten ein. <em>.value<\/em> und <em>child<\/em>.<\/li>\n<li><code>mutate(child = parse_number(child))<\/code> \u2014 wir wandeln die Werte des Feldes <em>child<\/em> von Text in den numerischen Datentyp um.<\/li>\n<\/ul>\n<p><\/p>\n<p>Jetzt k\u00f6nnen wir die erhaltene Spezifikation auf den urspr\u00fcnglichen Dataframe anwenden und die Tabelle in das gew\u00fcnschte Format bringen.<\/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>Wir verwenden das Argument <code>na.rm = TRUE<\/code>, da die aktuelle Datenstruktur unn\u00f6tige Zeilen f\u00fcr nicht existierende Beobachtungen erfordert. Da Familie 2 nur ein Kind hat, <code>na.rm = TRUE<\/code> wird sichergestellt, dass Familie 2 eine Zeile in den Ausgabedaten hat.<\/p>\n<p><\/p>\n<h2 id=\"preobrazovanie-data-freymov-iz-dlinnogo-formata-k-shirokomu\">Umwandlung von Data Frames vom langen Format in das breite Format<\/h2>\n<p><\/p>\n<p><code>pivot_wider()<\/code> \u2014 ist die Umkehrung der Transformation und erh\u00f6ht umgekehrt die Anzahl der Spalten des Dataframes, indem die Anzahl der Zeilen verringert wird.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"R-Paket tidyr und seine neuen Funktionen pivot_longer und pivot_wider\" src=\"\/wp-content\/uploads\/2020\/04\/b470664e06f362d6f0ea6df9c1ed426d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Eine solche Art der Transformation wird sehr selten verwendet, um Daten ordentlich darzustellen, dennoch kann diese Methode n\u00fctzlich sein, um Pivot-Tabellen zu erstellen, die in Pr\u00e4sentationen verwendet werden, oder um die Integration mit anderen Werkzeugen zu erleichtern.<\/p>\n<p><\/p>\n<p>Tats\u00e4chlich sind die Funktionen <code>pivot_longer()<\/code> und <code>pivot_wider()<\/code> symmetrisch und f\u00fchren gegenseitig entgegengesetzte Aktionen aus, d.h.: <code>df %&gt;% pivot_longer(spec = spec) %&gt;% pivot_wider(spec = spec)<\/code> und <code>df %&gt;% pivot_wider(spec = spec) %&gt;% pivot_longer(spec = spec)<\/code> stellt den urspr\u00fcnglichen df wieder her.<\/p>\n<p><\/p>\n<h3 id=\"prosteyshiy-primer-privedeniya-tablicy-k-shirokomu-formatu\">Ein einfaches Beispiel zur Umwandlung einer Tabelle in ein breites Format<\/h3>\n<p><\/p>\n<p>Um die Funktionsweise zu demonstrieren, <code>pivot_wider()<\/code> werden wir den Datensatz <em>fish_encounters<\/em>, verwenden, der Informationen dar\u00fcber speichert, wie verschiedene Stationen die Bewegung von Fischen im Fluss erfassen.<\/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>In den meisten F\u00e4llen wird diese Tabelle informativer und benutzerfreundlicher sein, wenn die Informationen zu jeder Station in einer separaten Spalte dargestellt werden.<\/p>\n<p><\/p>\n<p><code>fish_encounters %&gt;% pivot_wider(names_from = station, values_from = seen)<\/code><\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">fish_encounters %&gt;% pivot_wider(names_from = station, values_from = seen)\n#&gt; # A tibble: 19 x 12\n#&gt;    fish  Release I80_1 Lisbon  Rstr Base_TD   BCE   BCW  BCE2  BCW2   MAE\n#&gt;        &amp;;   &amp;; &amp;;   &amp;; &amp;; &amp;; &amp;; &amp;; &amp;\n#&gt;  1 4842        1     1      1     1       1     1     1     1     1     1\n#&gt;  2 4843        1     1      1     1       1     1     1     1     1     1\n#&gt;  3 4844        1     1      1     1       1     1     1     1     1     1\n#&gt;  4 4845        1     1      1     1       1    NA    NA    NA    NA    NA\n#&gt;  5 4847        1     1      1    NA      NA    NA    NA    NA    NA    NA\n#&gt;  6 4848        1     1      1     1      NA    NA    NA    NA    NA    NA\n#&gt;  7 4849        1     1     NA    NA      NA    NA    NA    NA    NA    NA\n#&gt;  8 4850        1     1     NA     1       1     1     1    NA    NA    NA\n#&gt;  9 4851        1     1     NA    NA      NA    NA    NA    NA    NA    NA\n#&gt; 10 4854        1     1     NA    NA      NA    NA    NA    NA    NA    NA\n#&gt; # \u2026 mit 9 weiteren Zeilen und 1 weiteren Variable: MAW<\/code><\/pre>\n<p><\/p>\n<p>Dieser Datensatz zeichnet Informationen nur in den F\u00e4llen auf, in denen ein Fisch von der Station erfasst wurde, d.h. wenn ein Fisch von einer Station nicht registriert wurde, sind diese Daten nicht in der Tabelle enthalten. Das bedeutet, dass die Ausgabewerte mit NA gef\u00fcllt werden. <\/p>\n<p><\/p>\n<p>In diesem Fall wissen wir jedoch, dass das Fehlen eines Eintrags bedeutet, dass der Fisch nicht beobachtet wurde, daher k\u00f6nnen wir das Argument <em>values_fill<\/em> in der Funktion <code>pivot_wider()<\/code> verwenden, um diese fehlenden Werte mit Nullen zu f\u00fcllen:<\/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\">Generierung eines Spaltennamens aus mehreren Ausgangsvariablen<\/h3>\n<p><\/p>\n<p>Stellen Sie sich vor, wir haben eine Tabelle, die eine Kombination aus Produkt, Land und Jahr enth\u00e4lt. Um einen Test-Datenrahmen zu generieren, k\u00f6nnen Sie den folgenden Code ausf\u00fchren:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">df %\n  filter((product == \"A\" &amp; country == \"AI\") | product == \"B\") %&gt;% \n  mutate(value = rnorm(nrow(.)))<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 45 x 4\n#&gt;    product country  year    value\n#&gt;    &lt;chr&gt;   &lt;chr&gt;   &lt;int&gt;    &lt;dbl&gt;\n#&gt;  1 A       AI       2000 -2.05   \n#&gt;  2 A       AI       2001 -0.676  \n#&gt;  3 A       AI       2002  1.60   \n#&gt;  4 A       AI       2003 -0.353  \n#&gt;  5 A       AI       2004 -0.00530\n#&gt;  6 A       AI       2005  0.442  \n#&gt;  7 A       AI       2006 -0.610  \n#&gt;  8 A       AI       2007 -2.77   \n#&gt;  9 A       AI       2008  0.899  \n#&gt; 10 A       AI       2009 -0.106  \n#&gt; # \u2026 with 35 more rows<\/code><\/pre>\n<p><\/p>\n<p>Unsere Aufgabe besteht darin, den Datenrahmen so zu erweitern, dass eine Spalte Daten f\u00fcr jede Kombination von Produkt und Land enth\u00e4lt. Dazu gen\u00fcgt es, den Argument <em>names_from<\/em> einen Vektor zu \u00fcbergeben, der die Namen der zu kombinierenden Felder enth\u00e4lt.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">df %&gt;% pivot_wider(names_from = c(product, country),\n                 values_from = \"value\")<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 15 x 4\n#&gt;     year     A_AI    B_AI    B_EI\n#&gt;    &lt;int&gt;    &lt;dbl&gt;   &lt;dbl&gt;   &lt;dbl&gt;\n#&gt;  1  2000 -2.05     0.607   1.20  \n#&gt;  2  2001 -0.676    1.65   -0.114 \n#&gt;  3  2002  1.60    -0.0245  0.501 \n#&gt;  4  2003 -0.353    1.30   -0.459 \n#&gt;  5  2004 -0.00530  0.921  -0.0589\n#&gt;  6  2005  0.442   -1.55    0.594 \n#&gt;  7  2006 -0.610    0.380  -1.28  \n#&gt;  8  2007 -2.77     0.830   0.637 \n#&gt;  9  2008  0.899    0.0175 -1.30  \n#&gt; 10  2009 -0.106   -0.195   1.03  \n#&gt; # \u2026 with 5 more rows<\/code><\/pre>\n<p><\/p>\n<p>Sie k\u00f6nnen auch Spezifikationen auf die Funktion anwenden. <code>pivot_wider()<\/code>. Aber bei der Eingabe in <code>pivot_wider()<\/code> f\u00fchrt die Spezifikation eine umgekehrte Umwandlung durch, <code>pivot_longer()<\/code>: es werden die in <em>.name<\/em>auf der Grundlage von Werten aus <em>.value<\/em> und anderen Spalten erstellt.<\/p>\n<p><\/p>\n<p>F\u00fcr diesen Datensatz k\u00f6nnen Sie eine benutzerdefinierte Spezifikation generieren, wenn Sie m\u00f6chten, dass jede m\u00f6gliche Kombination aus Land und Produkt eine eigene Spalte hat, und nicht nur diejenigen, die in den Daten vorhanden sind:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec % \n  expand(product, country, .value = \"value\") %&gt;% \n  unite(\".name\", product, country, remove = FALSE)<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 4 x 4\n#&gt;   .name product country .value\n#&gt;   &lt;chr&gt; &lt;chr&gt;   &lt;chr&gt;   &lt;chr&gt; \n#&gt; 1 A_AI  A       AI      value \n#&gt; 2 A_EI  A       EI      value \n#&gt; 3 B_AI  B       AI      value \n#&gt; 4 B_EI  B       EI      value<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">df %&gt;% pivot_wider(spec = spec) %&gt;% head()<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 6 x 5\n#&gt;    year     A_AI  A_EI    B_AI    B_EI\n#&gt;   &lt;int&gt;    &lt;dbl&gt; &lt;dbl&gt;   &lt;dbl&gt;   &lt;dbl&gt;\n#&gt; 1  2000 -2.05       NA  0.607   1.20  \n#&gt; 2  2001 -0.676      NA  1.65   -0.114 \n#&gt; 3  2002  1.60       NA -0.0245  0.501 \n#&gt; 4  2003 -0.353      NA  1.30   -0.459 \n#&gt; 5  2004 -0.00530    NA  0.921  -0.0589\n#&gt; 6  2005  0.442      NA -1.55    0.594<\/code><\/pre>\n<p><\/p>\n<h2 id=\"neskolko-prodvinutyh-primerov-raboty-s-novoy-koncepciey-tidyr\">Einige fortgeschrittene Beispiele f\u00fcr die Arbeit mit dem neuen Konzept von 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\">Daten in ein ordentliches Format bringen am Beispiel des Datensatzes zur Einkommens- und Mietsch\u00e4tzung in den USA<\/h3>\n<p><\/p>\n<p>Datensatz <em>us_rent_income<\/em> enth\u00e4lt Informationen \u00fcber das durchschnittliche Einkommen und die Miete f\u00fcr jeden Bundesstaat in den USA im Jahr 2017 (der Datensatz ist im Paket <strong>tidycensus<\/strong>).<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">us_rent_income\n#&gt; # Ein 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    Kalifornien income      29454   109\n#&gt; 10 06    Kalifornien rent         1358     3\n#&gt; # \u2026 mit 94 weiteren Zeilen<\/code><\/pre>\n<p><\/p>\n<p>in der Form, in der die Daten im Datensatz gespeichert sind <em>us_rent_income<\/em> Die Zusammenarbeit mit ihnen ist \u00e4u\u00dferst umst\u00e4ndlich, daher m\u00f6chten wir ein Datenset mit den Spalten erstellen: <em>miete<\/em>, <em>miete_moe<\/em>, <em>kommen<\/em>, <em>einkommen_moe<\/em>. Es gibt viele M\u00f6glichkeiten, diese Spezifikation zu erstellen, aber das Wichtigste ist, dass wir jede Kombination von Variablenwerten generieren m\u00fcssen und <em>sch\u00e4tzung\/moe<\/em>, und dann den Spaltennamen generieren.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">  spec % \n    expand(variable, .value = c(\"estimate\", \"moe\")) %&gt;% \n    mutate(\n      .name = paste0(variable, ifelse(.value == \"moe\", \"_moe\", \"\"))\n    )<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 4 x 3\n#&gt;   variable .value   .name     \n#&gt;   &lt;chr&gt;    &lt;chr&gt;    &lt;chr&gt;     \n#&gt; 1 income   estimate income    \n#&gt; 2 income   moe      income_moe\n#&gt; 3 rent     estimate rent      \n#&gt; 4 rent     moe      rent_moe<\/code><\/pre>\n<p><\/p>\n<p>Die Bereitstellung dieser Spezifikation <code>pivot_wider()<\/code> liefert uns das Ergebnis, das wir suchen:<\/p>\n<p><\/p>\n<p><code>us_rent_income %&gt;% pivot_wider(spez = spezi)<\/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\">Weltbank<\/h3>\n<p><\/p>\n<p>Manchmal erfordert die Anpassung eines Datensatzes an das gew\u00fcnschte Format mehrere Schritte.<br \/>\nDatensatz <em>weltbank_bev\u00f6lkerung<\/em> enth\u00e4lt Daten der Weltbank zur Bev\u00f6lkerung jedes Landes im Zeitraum von 2000 bis 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>Unser Ziel ist es, einen sauberen Datensatz zu erstellen, bei dem jede Variable in einer eigenen Spalte steht. Es ist noch unklar, welche Schritte genau erforderlich sind, aber wir beginnen mit dem offensichtlichsten Problem: das Jahr ist \u00fcber mehrere Spalten verteilt.<\/p>\n<p><\/p>\n<p>Um dies zu beheben, muss die Funktion verwendet werden <code>pivot_longer()<\/code>.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">pop2 % \n  pivot_longer(`2000`:`2017`, names_to = \"year\")<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 19,008 x 4\n#&gt;    country indicator   year  value\n#&gt;    &lt;chr&gt;   &lt;chr&gt;       &lt;chr&gt; &lt;dbl&gt;\n#&gt;  1 ABW     SP.URB.TOTL 2000  42444\n#&gt;  2 ABW     SP.URB.TOTL 2001  43048\n#&gt;  3 ABW     SP.URB.TOTL 2002  43670\n#&gt;  4 ABW     SP.URB.TOTL 2003  44246\n#&gt;  5 ABW     SP.URB.TOTL 2004  44669\n#&gt;  6 ABW     SP.URB.TOTL 2005  44889\n#&gt;  7 ABW     SP.URB.TOTL 2006  44881\n#&gt;  8 ABW     SP.URB.TOTL 2007  44686\n#&gt;  9 ABW     SP.URB.TOTL 2008  44375\n#&gt; 10 ABW     SP.URB.TOTL 2009  44052\n#&gt; # \u2026 with 18,998 more rows<\/code><\/pre>\n<p><\/p>\n<p>Der n\u00e4chste Schritt besteht darin, die Variable indicator zu betrachten.<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>Wo SP.POP.GROW \u2014 Bev\u00f6lkerungswachstum, SP.POP.TOTL \u2014 Gesamtbev\u00f6lkerung, und SP.URB. * ist das Gleiche, aber nur f\u00fcr st\u00e4dtische Gebiete. Lassen Sie uns diese Werte in zwei Variablen aufteilen: area \u2014 Gebiet (gesamt oder urban) und eine Variable, die die tats\u00e4chlichen Daten enth\u00e4lt (Bev\u00f6lkerung oder Wachstum):<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">pop3 % \n  separate(indicator, c(NA, \"area\", \"variable\"))<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 19,008 x 5\n#&gt;    country area  variable year  value\n#&gt;    &lt;chr&gt;   &lt;chr&gt; &lt;chr&gt;    &lt;chr&gt; &lt;dbl&gt;\n#&gt;  1 ABW     URB   TOTL     2000  42444\n#&gt;  2 ABW     URB   TOTL     2001  43048\n#&gt;  3 ABW     URB   TOTL     2002  43670\n#&gt;  4 ABW     URB   TOTL     2003  44246\n#&gt;  5 ABW     URB   TOTL     2004  44669\n#&gt;  6 ABW     URB   TOTL     2005  44889\n#&gt;  7 ABW     URB   TOTL     2006  44881\n#&gt;  8 ABW     URB   TOTL     2007  44686\n#&gt;  9 ABW     URB   TOTL     2008  44375\n#&gt; 10 ABW     URB   TOTL     2009  44052\n#&gt; # \u2026 with 18,998 more rows<\/code><\/pre>\n<p><\/p>\n<p>Jetzt bleibt uns nur noch, die Variable variable in zwei Spalten aufzuteilen:<\/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\">Kontakliste<\/h3>\n<p><\/p>\n<p>Im letzten Beispiel stellen Sie sich vor, dass Sie eine Kontaktliste haben, die Sie von einer Website kopiert und eingef\u00fcgt haben:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">contacts &lt;- tribble(\n  ~field, ~value,\n  &quot;name&quot;, &quot;Jiena McLellan&quot;,\n  &quot;company&quot;, &quot;Toyota&quot;, \n  &quot;name&quot;, &quot;John Smith&quot;, \n  &quot;company&quot;, &quot;google&quot;, \n  &quot;email&quot;, &quot;john@google.com&quot;,\n  &quot;name&quot;, &quot;Huxley Ratcliffe&quot;\n)<\/code><\/pre>\n<p><\/p>\n<p>Die Umwandlung dieser Liste in eine tabellarische Form ist ziemlich schwierig, da es keine Variable gibt, die identifiziert, welche Daten zu welchem Kontakt geh\u00f6ren. Wir k\u00f6nnen dies korrigieren, indem wir feststellen, dass die Daten zu jedem neuen Kontakt mit dem Namen (\"name\") beginnen; daher k\u00f6nnen wir eine eindeutige Kennung erstellen und sie bei jeder Auftreten des Wertes \"name\" in der Spalte field um eins erh\u00f6hen:<\/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>Jetzt, wo wir eine einzigartige Kennung f\u00fcr jeden Kontakt haben, k\u00f6nnen wir das Feld und den Wert in Spalten umwandeln:<\/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\">Fazit<\/h2>\n<p><\/p>\n<p>Meiner Meinung nach ist das neue Konzept <strong>tidyr<\/strong> tats\u00e4chlich intuitiver und \u00fcbertrifft die veralteten Funktionen deutlich in der Funktionalit\u00e4t. <code>spread()<\/code> und <code>gather()<\/code>Ich hoffe, dieser Artikel hat Ihnen geholfen, das Thema zu verstehen. <code>pivot_longer()<\/code> und <code>pivot_wider()<\/code>.<\/p>\n<p>Quelle: <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 4.9.10 - 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 \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.\" \/>\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\/de\/blog\/administrirovanie\/r-paket-tidyr-i-ego-novye-funkczii-pivot_longer-i-pivot_wider\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\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 \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.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/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\udd47 R-Paket tidyr und seine neuen Funktionen pivot_longer und pivot_wider | ProHoster","description":"Das Paket tidyr geh\u00f6rt zum Kern einer der beliebtesten Bibliotheken in der R-Sprache \u2013 tidyverse. Der Hauptzweck des Pakets ist es, Daten in eine ordentliche Form zu bringen. Auf Habr gibt es bereits einen Artikel zu diesem Paket, der jedoch auf das Jahr 2015 datiert ist. Ich m\u00f6chte \u00fcber die aktuellsten \u00c4nderungen berichten, die vor einigen Tagen von seinem Autor Hadley Wickham angek\u00fcndigt wurden.","canonical_url":"https:\/\/prohoster.info\/de\/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":"de_DE","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 \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.","og:url":"https:\/\/prohoster.info\/de\/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"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/76291","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=76291"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/76291\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/76292"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=76291"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=76291"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=76291"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}