{"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":"Das R-Paket tidyr und seine neuen Funktionen pivot_longer und pivot_wider.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Paket <strong>tidyr<\/strong> ist Teil eines der beliebtesten Bibliotheken in der Programmiersprache R - <strong>tidyverse<\/strong>.<br \/>\nDie Hauptfunktion des Pakets besteht darin, Daten in eine saubere Form zu bringen.<\/p>\n<p><\/p>\n<p>Auf Habr gibt es bereits <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/248741\/\">Ver\u00f6ffentlichung<\/a><\/noindex> einige Informationen zu diesem Paket, aber sie stammen aus dem Jahr 2015. Ich m\u00f6chte jedoch \u00fcber die aktuellsten \u00c4nderungen berichten, die vor einigen Tagen von seinem Autor Hadley Wickham bekannt gegeben wurden.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Das 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 gelten?<\/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 in der aktuellen Form im Paket 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>Wenn Sie sich f\u00fcr Datenanalyse interessieren, k\u00f6nnten Ihnen 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. Ein gro\u00dfer Teil 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 der TidyData<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#osnovnye-funkcii-vhodyaschie-v-paket-tydir\">Die Hauptfunktionen des Pakets tidyr<\/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 Transformation von Daten aus breitem Format in langes und umgekehrt<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/ustnovka-naibolee-aktualnoy-versii-tidyr-0839000\">Installation der aktuellsten Version tidyr 0.8.3.9000<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#perehod-na-novye-funkcii\">Wechsel 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 breitem Format in 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 unter Verwendung mehrerer Werte (.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 ins breite<\/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 breites Format<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#generaciya-imeni-stolbca-iz-neskolkih-ishodnyh-peremennyh\">Generierung des 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 eine saubere Form bringen am Beispiel eines Datensatzes zur Einkommens- und Mietstatistik 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\">Kontaktliste<\/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 der TidyData<\/h2>\n<p><\/p>\n<p>Ziel <strong>tidyr<\/strong> \u2014 helfen Ihnen, Daten in die sogenannte saubere Form zu bringen. Saubere Daten sind Daten, bei denen: <\/p>\n<p><\/p>\n<ul>\n<li>Jede Variable in einer Spalte ist. <\/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 Daten, die in tidying up formatiert sind, l\u00e4sst sich bei der Analyse erheblich einfacher und bequemer arbeiten.<\/p>\n<p><\/p>\n<h2 id=\"osnovnye-funkcii-vhodyaschie-v-paket-tidyr\">Die Hauptfunktionen des Pakets tidyr<\/h2>\n<p><\/p>\n<p>tidyr enth\u00e4lt eine Reihe von Funktionen, die f\u00fcr die Transformation von Tabellen bestimmt sind:<\/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 Felder mithilfe eines Trennzeichens;<\/li>\n<li><code>unite()<\/code> \u2014 f\u00fchrt mehrere Felder zu einem zusammen, das Gegenteil der Funktion <code>separate()<\/code>;<\/li>\n<li><code>pivot_longer()<\/code> \u2014 eine Funktion, die Daten vom breiten Format in das lange Format umwandelt;<\/li>\n<li><code>pivot_wider()<\/code> \u2014 eine Funktion, die Daten vom langen Format in das breite Format umwandelt. Eine umgekehrte Operation dessen, was die Funktion <code>pivot_longer()<\/code>.<\/li>\n<li><code>gather()<\/code><strong>veraltet<\/strong> \u2014 eine Funktion, die Daten vom breiten Format in das lange Format umwandelt;<\/li>\n<li><code>spread()<\/code><strong>veraltet<\/strong> \u2014 eine Funktion, die Daten vom langen Format in das breite Format umwandelt. Eine umgekehrte Operation dessen, 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 Transformation von Daten aus breitem Format in langes und umgekehrt<\/h2>\n<p><\/p>\n<p>Fr\u00fcher wurden f\u00fcr diese Art von Transformation Funktionen verwendet <code>gather()<\/code> und <code>spread()<\/code>. Im Laufe der Jahre ist es offensichtlich geworden, dass die Namen dieser Funktionen und ihrer Argumente f\u00fcr die meisten Benutzer, einschlie\u00dflich des Autors des Pakets, nicht sehr offensichtlich waren und Schwierigkeiten beim Finden und Verstehen der Funktionalit\u00e4t verursacht haben, die das DataFrame von breitem in langes Format und umgekehrt verwandelt.<\/p>\n<p><\/p>\n<p>In diesem Zusammenhang wurden in <strong>tidyr<\/strong> zwei neue, wichtige Funktionen hinzugef\u00fcgt, die f\u00fcr die Transformation von DataFrames gedacht sind.<\/p>\n<p><\/p>\n<p>Neue Funktionen <code>pivot_longer()<\/code> und <code>pivot_wider()<\/code> Diese wurden inspiriert von einigen Funktionen aus dem Paket <strong>cdata<\/strong>, das von John Mount und Nina Zumel erstellt wurde.<\/p>\n<p><\/p>\n<h3 id=\"ustanovka-naibolee-aktualnoy-versii-tidyr-0839000\">Installation der aktuellsten Version tidyr 0.8.3.9000<\/h3>\n<p><\/p>\n<p>F\u00fcr die Installation der neuen, aktuellsten Version des Pakets <strong>tidyr<\/strong> <em>0.8.3.9000<\/em>, in der die neuen Funktionen verf\u00fcgbar sind, 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 Entwicklerversion des Pakets auf GitHub verf\u00fcgbar.<\/p>\n<p><\/p>\n<h3 id=\"perehod-na-novye-funkcii\">Wechsel zu neuen Funktionen<\/h3>\n<p><\/p>\n<p>Tats\u00e4chlich ist es nicht schwer, \u00e4ltere Skripte auf die neuen Funktionen umzustellen; um ein besseres Verst\u00e4ndnis zu erlangen, werde ich ein Beispiel aus der Dokumentation der alten Funktionen nehmen und zeigen, wie dieselben Operationen mit Hilfe der neuen <code>pivot_*()<\/code> Funktionen durchgef\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>Transformation von langem Format in breites.<\/p>\n<p>\n<b class=\"spoiler_title\">Beispielcode 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>, in der Ausgangstabelle <em>stocks<\/em> keine Spalten aufgef\u00fchrt sind, die in den Argumenten <em>names_to<\/em> und <em>values_to<\/em> angegeben werden, m\u00fcssen ihre Namen in Anf\u00fchrungszeichen angegeben werden.<\/p>\n<p><\/p>\n<p>Eine Tabelle, mit der Sie am einfachsten verstehen k\u00f6nnen, wie Sie zur neuen Konzeptarbeit \u00fcbergehen <strong>tidyr<\/strong>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Das 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\">Hinweis des Autors<\/h2>\n<p><\/p>\n<blockquote><p>Der nachfolgende Text ist eine adaptive, ich w\u00fcrde sogar sagen freie \u00dcbersetzung der <noindex><a rel=\"nofollow\" href=\"https:\/\/tidyr.tidyverse.org\/dev\/articles\/pivot.html\">Vignetten<\/a><\/noindex> von der offiziellen Webseite der tidyverse-Bibliothek.<\/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 breitem Format in langes<\/h2>\n<p><\/p>\n<p><code>pivot_longer ()<\/code> macht Datens\u00e4tze l\u00e4nger, verringert die Anzahl der Spalten und erh\u00f6ht die Anzahl der Zeilen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Das 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 diesem Artikel dargestellten Beispiele auszuf\u00fchren, m\u00fcssen zun\u00e4chst die ben\u00f6tigten 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 \u00fcber die Religion der Befragten in den Zeilen, w\u00e4hrend das Einkommensniveau in den Spaltennamen verteilt ist. Die Anzahl der Befragten aus jeder Kategorie wird in den Zellen gespeichert, die das Kreuzungspunkt von Religion und Einkommensniveau darstellen. 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; # A tibble: 180 x 3\n#&gt;    religion income             count\n#&gt;                      \n#&gt;  1 Agnostiker   2 Agnostiker 10-20k               34\n#&gt;  3 Agnostiker 20-30k               60\n#&gt;  4 Agnostiker 30-40k               81\n#&gt;  5 Agnostiker 40-50k               76\n#&gt;  6 Agnostiker 50-75k              137\n#&gt;  7 Agnostiker 75-100k             122\n#&gt;  8 Agnostiker 100-150k            109\n#&gt;  9 Agnostiker &gt;150k                 84\n#&gt; 10 Agnostiker Wei\u00df nicht\/antwort verweigert    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>Das erste Argument <em>cols<\/em>, beschreibt, welche Spalten aggregiert werden sollen. In diesem Fall alle Spalten au\u00dfer <em>time<\/em>.<\/li>\n<li>Argument <em>names_to<\/em> gibt den Namen der Variablen an, die aus den Spaltennamen, die wir aggregiert haben, erstellt wird.<\/li>\n<li><em>values_to<\/em> gibt den Namen der Variablen an, die aus den Werten, die in den aggregierten Spalten gespeichert sind, erstellt wird.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"specifikacii\">Spezifikationen<\/h2>\n<p><\/p>\n<p>Das ist eine neue Funktionalit\u00e4t des Pakets <strong>tidyr<\/strong>, die zuvor beim Arbeiten mit veralteten Funktionen nicht verf\u00fcgbar war.<\/p>\n<p><\/p>\n<p>Die Spezifikation ist ein Datenrahmen, wobei jede Zeile einer Spalte im neuen Ausgabedatenrahmen entspricht, und zwei speziellen Spalten, 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 Werte der Zellen eingehen. <\/li>\n<\/ul>\n<p><\/p>\n<p>Die anderen Spalten der Spezifikation spiegeln wider, wie im neuen Feld die Namen der aggregierten Spalten aus <em>.name<\/em>.<\/p>\n<p><\/p>\n<p>Die Spezifikation beschreibt die Metadaten, die im Spaltennamen gespeichert sind, mit einer Zeile f\u00fcr jede Spalte und einer Spalte f\u00fcr jede Variable, die mit dem Spaltennamen aggregiert wird. Das mag jetzt kompliziert erscheinen, aber nach dem Durchsehen mehrerer Beispiele wird alles viel klarer.<\/p>\n<p><\/p>\n<p>Der Sinn der Spezifikation besteht darin, dass Sie Metadaten zum transformierten Datenrahmen extrahieren, \u00e4ndern und hinzuf\u00fcgen k\u00f6nnen.<\/p>\n<p><\/p>\n<p>Um mit Spezifikationen beim Umwandeln der Tabelle vom breiten Format in das lange Format zu arbeiten, wird die Funktion <code>pivot_longer_spec()<\/code>.<\/p>\n<p><\/p>\n<p>Die Funktionsweise dieser Funktion besteht darin, dass sie jeden Datenrahmen nimmt und dessen Metadaten auf die oben beschriebene Weise formt. <\/p>\n<p><\/p>\n<p>Als Beispiel nehmen wir den Datensatz who, der zusammen mit dem Paket bereitgestellt wird. <strong>tidyr<\/strong>Dieser Datensatz enth\u00e4lt Informationen, die von der Weltgesundheitsorganisation \u00fcber die Tuberkulose-Inzidenz bereitgestellt werden.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">who\n#&gt; # Ein Tibble: 7.240 x 60\n#&gt;    land iso2  iso3   jahr neue_sp_m014 neue_sp_m1524 neue_sp_m2534\n#&gt;                                \n#&gt;  1 Afghan\u2026 AF    AFG    1980          NA           NA           NA\n#&gt;  2 Afghan\u2026 AF    AFG    1981          NA           NA           NA\n#&gt;  3 Afghan\u2026 AF    AFG    1982          NA           NA           NA\n#&gt;  4 Afghan\u2026 AF    AFG    1983          NA           NA           NA\n#&gt;  5 Afghan\u2026 AF    AFG    1984          NA           NA           NA\n#&gt;  6 Afghan\u2026 AF    AFG    1985          NA           NA           NA\n#&gt;  7 Afghan\u2026 AF    AFG    1986          NA           NA           NA\n#&gt;  8 Afghan\u2026 AF    AFG    1987          NA           NA           NA\n#&gt;  9 Afghan\u2026 AF    AFG    1988          NA           NA           NA\n#&gt; 10 Afghan\u2026 AF    AFG    1989          NA           NA           NA\n#&gt; # \u2026 mit 7.230 weiteren Zeilen und 53 weiteren Variablen<\/code><\/pre>\n<p><\/p>\n<p>Lass uns die 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>land<\/em>, <em>iso2<\/em>, <em>iso3<\/em> sind bereits Variablen. Unsere Aufgabe ist es, die Spalten zu transponieren mit <em>new_sp_m014<\/em> nach <em>newrel_f65<\/em>.<\/p>\n<p><\/p>\n<p>In den Bezeichnern dieser Spalten befindet sich folgende Information:<\/p>\n<p><\/p>\n<ul>\n<li>Pr\u00e4fix <code>new_<\/code> zeigt an, dass die Spalte Daten zu neuen Tuberkulose-F\u00e4llen enth\u00e4lt; der aktuelle Datenrahmen enth\u00e4lt nur Informationen zu neuen Erkrankungen, deshalb hat dieses Pr\u00e4fix im aktuellen Kontext keine bedeutende Last.<\/li>\n<li><code>sp<\/code>\/<code>rel<\/code>\/<code>sp<\/code>\/<code>ep<\/code> beschreibt die Diagnosemethode der Erkrankung.<\/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> Altersgruppe des Patienten.<\/li>\n<\/ul>\n<p><\/p>\n<p>Wir k\u00f6nnen diese Spalten mit der Funktion <code>extract()<\/code>, mithilfe 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, dass die Spalte <em>.name<\/em> unver\u00e4ndert bleiben sollte, da dies unser Index in den Namen der Spalten 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, um die von uns erstellte Spezifikation auf den urspr\u00fcnglichen Datenrahmen anzuwenden, <em>who<\/em> m\u00fcssen wir 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=\"Das 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 unter Verwendung mehrerer Werte (.value)<\/h2>\n<p><\/p>\n<p>Im obigen Beispiel ist die Spezifikationsspalte <em>.value<\/em> enthielt nur einen Wert, was in den meisten F\u00e4llen so ist. <\/p>\n<p><\/p>\n<p>Aber gelegentlich kann eine Situation auftreten, in der Sie Daten aus Spalten mit unterschiedlichen Datentypen in den Werten sammeln m\u00fcssen. Mit der veralteten Funktion <code>spread()<\/code> w\u00e4re es ziemlich schwierig zu verwirklichen.<\/p>\n<p><\/p>\n<p>Das folgende Beispiel stammt 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\">familie &lt;- tibble::tribble(\n  ~familie,  ~dob_kind1,  ~dob_kind2, ~gender_kind1, ~gender_kind2,\n       1L, &quot;1998-11-26&quot;, &quot;2000-01-29&quot;,             1L,             2L,\n       2L, &quot;1996-06-22&quot;,           NA,             2L,             NA,\n       3L, &quot;2002-07-11&quot;, &quot;2004-04-05&quot;,             2L,             2L,\n       4L, &quot;2004-10-10&quot;, &quot;2009-08-27&quot;,             1L,             1L,\n       5L, &quot;2000-12-05&quot;, &quot;2005-02-28&quot;,             2L,             1L,\n)\nfamilie % mutate_at(vars(starts_with(\"dob\")), parse_date)<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 5 x 5\n#&gt;   family dob_child1 dob_child2 gender_child1 gender_child2\n#&gt;    &lt;int&gt; &lt;date&gt;     &lt;date&gt;             &lt;int&gt;         &lt;int&gt;\n#&gt; 1      1 1998-11-26 2000-01-29             1             2\n#&gt; 2      2 1996-06-22 NA                     2            NA\n#&gt; 3      3 2002-07-11 2004-04-05             2             2\n#&gt; 4      4 2004-10-10 2009-08-27             1             1\n#&gt; 5      5 2000-12-05 2005-02-28             2             1<\/code><\/pre>\n<p><\/p>\n<p>Der erstellte Datenrahmen enth\u00e4lt in jeder Zeile Daten zu den Kindern einer Familie. In 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 angeordnet sind, unsere Aufgabe ist es, diese Daten in das richtige Analyseformat zu bringen.<\/p>\n<p><\/p>\n<p>Beachten Sie, dass wir zwei Variablen mit Informationen \u00fcber jedes Kind haben: sein Geschlecht und das 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 angezeigt werden. Wir k\u00f6nnen dies tun, indem wir eine Spezifikation generieren, in der die Spalte <code>.value<\/code> zwei verschiedene Werte annehmen wird.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec %\n  pivot_longer_spec(-familie) %&gt;%\n  separate(col = name, into = c(\".value\", \"kind\")) %&gt;%\n  mutate(kind = parse_number(kind))\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\", \"kind\"))<\/code> \u2014 wir teilen die Spalte <em>.name<\/em>, die die Namen der urspr\u00fcnglichen Felder enth\u00e4lt, durch Unterstriche und tragen die erhaltenen Werte in die Spalten <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 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0432 \u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 um.<\/li>\n<\/ul>\n<p><\/p>\n<p>Jetzt k\u00f6nnen wir die erhaltene Spezifikation auf den urspr\u00fcnglichen Datenrahmen anwenden und die Tabelle in die gew\u00fcnschte Form 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>, weil die aktuelle Form der Daten dazu zwingt, zus\u00e4tzliche Zeilen f\u00fcr nicht vorhandene Beobachtungen zu erstellen. Da Familie 2 nur ein Kind hat, <code>na.rm = TRUE<\/code> garantiert, dass Familie 2 eine Zeile in den Ausgaben haben wird.<\/p>\n<p><\/p>\n<h2 id=\"preobrazovanie-data-freymov-iz-dlinnogo-formata-k-shirokomu\">Umwandlung von Data Frames vom langen Format ins breite<\/h2>\n<p><\/p>\n<p><code>pivot_wider()<\/code> ist eine Umwandlung, die umgekehrt ist, und wiederum die Anzahl der Spalten im Dataframe erh\u00f6ht, indem die Anzahl der Zeilen verringert wird.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Das 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 Umwandlung wird \u00e4u\u00dferst selten verwendet, um Daten in eine ordentliche Form zu bringen; dennoch kann dieses Verfahren n\u00fctzlich sein, um Pivot-Tabellen f\u00fcr Pr\u00e4sentationen zu erstellen oder f\u00fcr die Integration mit anderen Tools.<\/p>\n<p><\/p>\n<p>Tats\u00e4chlich sind die Funktionen <code>pivot_longer()<\/code> und <code>pivot_wider()<\/code> symmetrisch und f\u00fchren gegens\u00e4tzliche 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> wird das urspr\u00fcngliche df zur\u00fcckgeben.<\/p>\n<p><\/p>\n<h3 id=\"prosteyshiy-primer-privedeniya-tablicy-k-shirokomu-formatu\">Ein einfaches Beispiel zur Umwandlung einer Tabelle in breites Format<\/h3>\n<p><\/p>\n<p>Zur Demonstration der Funktionsweise <code>pivot_wider()<\/code> werden wir den Datensatz <em>fish_encounters<\/em>, der Informationen dar\u00fcber enth\u00e4lt, wie verschiedene Stationen die Bewegungen von Fischen im Fluss dokumentieren.<\/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 f\u00fcr jede 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; # Ein 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;; &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 weiterer Variable: MAW<\/code><\/pre>\n<p><\/p>\n<p>Dieser Datensatz zeichnet Informationen nur dann auf, wenn der Fisch von einer Station erkannt wurde, d.h. wenn ein Fisch von einer Station nicht erfasst wurde, dann werden diese Daten in der Tabelle nicht vorhanden sein. Das bedeutet, dass die Ausgabe mit NA gef\u00fcllt wird. <\/p>\n<p><\/p>\n<p>In diesem Fall wissen wir jedoch, dass das Fehlen eines Eintrags bedeutet, dass der Fisch nicht gesehen wurde; daher k\u00f6nnen wir das Argument <em>values_fill<\/em> in der Funktion <code>pivot_wider()<\/code> verwenden und diese fehlenden Werte mit nullen auff\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 des Spaltennamens aus mehreren Ausgangsvariablen<\/h3>\n<p><\/p>\n<p>Stellen Sie sich vor, wir haben eine Tabelle, die Kombinationen aus Produkt, Land und Jahr enth\u00e4lt. Um ein Test-Datenframe zu generieren, kann der folgende Code ausgef\u00fchrt werden:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">df %\n  filter((produkt == \"A\" &amp; land == \"AI\") | produkt == \"B\") %&gt;% \n  mutate(wert = 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 ist es, das Datenframe so zu erweitern, dass eine Spalte Daten f\u00fcr jede Kombination aus Produkt und Land enth\u00e4lt. Daf\u00fcr gen\u00fcgt es, das Argument <em>names_from<\/em> mit einem Vektor, der die Namen der zu kombinierenden Felder enth\u00e4lt, zu \u00fcbergeben.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">df %&gt;% pivot_wider(names_from = c(produkt, land),\n                 values_from = \"wert\")<\/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 f\u00fcr die Funktion <code>pivot_wider()<\/code>. Aber bei der \u00dcbergabe zu <code>pivot_wider()<\/code> f\u00fchrt die Spezifikation eine umgekehrte Transformation aus, <code>pivot_longer()<\/code>: es werden Spalten erstellt, die in <em>.name<\/em>angegeben sind, unter Verwendung der Werte aus <em>.value<\/em> und anderen Spalten.<\/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 die, die in den Daten vorhanden sind:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec % \n  expand(produkt, land, .value = \"wert\") %&gt;% \n  unite(\".name\", produkt, land, remove = FALSE)<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 4 x 4\n#&gt;   .name product country .value\n#&gt;   &lt;chr&gt; &lt;chr&gt;   &lt;chr&gt;   &lt;chr&gt; \n#&gt; 1 A_AI  A       AI      value \n#&gt; 2 A_EI  A       EI      value \n#&gt; 3 B_AI  B       AI      value \n#&gt; 4 B_EI  B       EI      value<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">df %&gt;% pivot_wider(spec = spec) %&gt;% head()<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 6 x 5\n#&gt;    year     A_AI  A_EI    B_AI    B_EI\n#&gt;   &lt;int&gt;    &lt;dbl&gt; &lt;dbl&gt;   &lt;dbl&gt;   &lt;dbl&gt;\n#&gt; 1  2000 -2.05       NA  0.607   1.20  \n#&gt; 2  2001 -0.676      NA  1.65   -0.114 \n#&gt; 3  2002  1.60       NA -0.0245  0.501 \n#&gt; 4  2003 -0.353      NA  1.30   -0.459 \n#&gt; 5  2004 -0.00530    NA  0.921  -0.0589\n#&gt; 6  2005  0.442      NA -1.55    0.594<\/code><\/pre>\n<p><\/p>\n<h2 id=\"neskolko-prodvinutyh-primerov-raboty-s-novoy-koncepciey-tidyr\">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 eine saubere Form bringen am Beispiel eines Datensatzes zur Einkommens- und Mietstatistik in den USA<\/h3>\n<p><\/p>\n<p>Datensatz <em>us_rent_income<\/em> enth\u00e4lt Informationen \u00fcber das durchschnittliche Einkommen und die Mietkosten f\u00fcr jeden Bundesstaat in den USA im Jahr 2017 (der Datensatz ist im Package <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 mit 94 weiteren Zeilen<\/code><\/pre>\n<p><\/p>\n<p>In der Form, in der die Daten im Datensatz gespeichert sind, ist es \u00e4u\u00dferst unpraktisch, mit ihnen zu arbeiten, daher m\u00f6chten wir einen Datensatz mit den Spalten: <em>us_rent_income<\/em> rent <em>rent_moe<\/em>, <em>come<\/em>, <em>income_moe<\/em>, <em>. Es gibt viele M\u00f6glichkeiten, diese Spezifikation zu erstellen, aber das Wichtigste ist, dass wir jede Kombination aus Variablenwerten und<\/em>estimate\/moe <em>, und dann den Namen der Spalte generieren m\u00fcssen.<\/em>spec % \n    expand(variable, .value = c(\"estimate\", \"moe\")) %&gt;% \n    mutate(\n      .name = paste0(variable, ifelse(.value == \"moe\", \"_moe\", \"\"))\n    )<\/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>gibt uns das Ergebnis, das wir suchen: <code>pivot_wider()<\/code> us_rent_income %&gt;% pivot_wider(spec = spec)<\/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\">Weltbank<\/h3>\n<p><\/p>\n<p>Manchmal erfordert die Umformung eines Datensatzes mehrere Schritte.<br \/>\nDatensatz <em>world_bank_pop<\/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 ordentlichen 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 = \"jahr\")<\/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 das Bev\u00f6lkerungswachstum, SP.POP.TOTL die Gesamtbev\u00f6lkerung und SP.URB.* das Gleiche, aber nur f\u00fcr st\u00e4dtische Gebiete ist. Lassen Sie uns diese Werte in zwei Variablen aufteilen: area \u2013 Gebiet (total oder urban) und eine Variable, die die tats\u00e4chlichen Daten enth\u00e4lt (population oder growth):<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">pop3 % \n  separate(indicator, c(NA, \"gebiet\", \"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 m\u00fcssen wir nur noch die Variable variable in zwei Spalten aufteilen:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">pop3 %&gt;% \n  pivot_wider(names_from = variable, values_from = value)<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 9,504 x 5\n#&gt;    country area  year   TOTL    GROW\n#&gt;    &lt;chr&gt;   &lt;chr&gt; &lt;chr&gt; &lt;dbl&gt;   &lt;dbl&gt;\n#&gt;  1 ABW     URB   2000  42444  1.18  \n#&gt;  2 ABW     URB   2001  43048  1.41  \n#&gt;  3 ABW     URB   2002  43670  1.43  \n#&gt;  4 ABW     URB   2003  44246  1.31  \n#&gt;  5 ABW     URB   2004  44669  0.951 \n#&gt;  6 ABW     URB   2005  44889  0.491 \n#&gt;  7 ABW     URB   2006  44881 -0.0178\n#&gt;  8 ABW     URB   2007  44686 -0.435 \n#&gt;  9 ABW     URB   2008  44375 -0.698 \n#&gt; 10 ABW     URB   2009  44052 -0.731 \n#&gt; # \u2026 with 9,494 more rows<\/code><\/pre>\n<p><\/p>\n<h3 id=\"spisok-kontaktov\">Kontaktliste<\/h3>\n<p><\/p>\n<p>Als letztes Beispiel, stellen Sie sich vor, Sie haben eine Liste von Kontakten, die Sie von einer Website kopiert und eingef\u00fcgt haben:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">kontakte &lt;- tribble(\n  ~feld, ~wert,\n  &quot;name&quot;, &quot;Jiena McLellan&quot;,\n  &quot;firma&quot;, &quot;Toyota&quot;, \n  &quot;name&quot;, &quot;John Smith&quot;, \n  &quot;firma&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 ein Tabellenformat ist ziemlich schwierig, da es keine Variable gibt, die identifiziert, welche Daten zu welchem Kontakt geh\u00f6ren. Wir k\u00f6nnen dies beheben, indem wir beachten, dass die Daten f\u00fcr jeden neuen Kontakt mit dem Namen (&quot;name&quot;) beginnen. Daher k\u00f6nnen wir einen eindeutigen Identifikator erstellen und diesen jedes Mal um eins erh\u00f6hen, wenn im Feld column der Wert \"name\" auftaucht.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">contacts &lt;- contacts %&gt;% \n  mutate(\n    person_id = cumsum(field == &quot;name&quot;)\n  )\ncontacts<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 6 x 3\n#&gt;   field   value            person_id\n#&gt;   &lt;chr&gt;   &lt;chr&gt;                &lt;int&gt;\n#&gt; 1 name    Jiena McLellan           1\n#&gt; 2 company Toyota                   1\n#&gt; 3 name    John Smith               2\n#&gt; 4 company google                   2\n#&gt; 5 email   john@google.com          2\n#&gt; 6 name    Huxley Ratcliffe         3<\/code><\/pre>\n<p><\/p>\n<p>Jetzt, wo wir eine eindeutige ID f\u00fcr jeden Kontakt haben, k\u00f6nnen wir das Feld und den Wert in Spalten drehen:<\/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>Pers\u00f6nlich denke ich, dass das neue Konzept <strong>tidyr<\/strong> wirklich intuitiver ist und die veralteten Funktionen in der Funktionalit\u00e4t deutlich \u00fcbertrifft. <code>spread()<\/code> und <code>gather()<\/code>Ich hoffe, dieser Artikel hat Ihnen geholfen, sich mit <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 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0430\u043a\u0435\u0442 tidyr \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u044f\u0434\u0440\u043e \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 R \u2014 tidyverse. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 \u2014 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e\u043c\u0443 \u0432\u0438\u0434\u0443. \u041d\u0430 \u0425\u0430\u0431\u0440\u0435.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/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) 5.0.1.1\" \/>\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.\" \/>\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\udd47R-Paket tidyr und seine neuen Funktionen pivot_longer und pivot_wider | ProHoster","description":"Das Paket tidyr ist ein Kernbestandteil einer der beliebtesten Bibliotheken in der Programmiersprache R \u2013 tidyverse. Der Hauptzweck des Pakets ist die Aufbereitung von Daten in eine ordentliche Form. Auf Habr.","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.","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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}