{"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\/es\/blog\/administrirovanie\/r-paket-tidyr-i-ego-novye-funkczii-pivot_longer-i-pivot_wider","title":{"rendered":"El paquete R tidyr y sus nuevas funciones pivot_longer y pivot_wider","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Paquete <strong>tidyr<\/strong> es parte del n\u00facleo de una de las bibliotecas m\u00e1s populares en el lenguaje R \u2014 <strong>tidyverse<\/strong>.<br \/>\nLa principal finalidad del paquete es convertir los datos en un formato limpio.<\/p>\n<p><\/p>\n<p>Ya hay art\u00edculos en Habr <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/248741\/\">publicaci\u00f3n<\/a><\/noindex> dedicados a este paquete, pero datan de 2015. Quiero hablar sobre los cambios m\u00e1s relevantes que su autor, Hadley Wickham, anunci\u00f3 hace unos d\u00edas.<\/p>\n<p>\n<img decoding=\"async\" alt=\"El paquete R tidyr y sus nuevas funciones pivot_longer y pivot_wider\" src=\"\/wp-content\/uploads\/2020\/04\/a290263b63aaea3db70e83a1ec411415.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<blockquote><p><b>SJK<\/b>: \u00bfLas funciones gather() y spread() se considerar\u00edan obsoletas?<\/p>\n<p><b>Hadley Wickham<\/b>: En cierta medida. Dejaremos de recomendar el uso de estas funciones y de corregir errores en ellas, pero seguir\u00e1n estando presentes en el paquete en su estado actual.<\/p><\/blockquote>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"soderzhanie\">Contenido<\/h2>\n<p><\/p>\n<p><em>canales de youtube. La mayor parte del contenido est\u00e1 dedicado al lenguaje R. <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/R4marketing\">telegram<\/a><\/noindex> y <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/R4marketing\/?sub_confirmation=1\">Proceso de construcci\u00f3n del bot<\/a><\/noindex> canales. Gran parte del contenido est\u00e1 dedicado al lenguaje R.<\/em><\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"#koncepciya-tidydata\">La concepci\u00f3n de TidyData<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#osnovnye-funkcii-vhodyaschie-v-paket-tydir\">Funciones principales incluidas en el paquete tidyr<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#novaya-koncepciya-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy-i-naoborot\">Un nuevo concepto para convertir datos de un formato ancho a un formato largo y viceversa<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/ustnovka-naibolee-aktualnoy-versii-tidyr-0839000\">Instalaci\u00f3n de la versi\u00f3n m\u00e1s reciente de tidyr 0.8.3.9000<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#perehod-na-novye-funkcii\">Transici\u00f3n a nuevas funciones<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#prostoy-primer-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy\">Un ejemplo simple de conversi\u00f3n de datos de formato ancho a largo<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#specifikacii\">Especificaciones<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#specifikaciya-s-ispolzovaniem-neskolkih-znacheniyvalue\">Especificaci\u00f3n utilizando m\u00faltiples valores (.value)<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#preobrazovanie-data-freymov-iz-dlinnogo-formata-k-shirokomu\">Conversi\u00f3n de data frames de formato largo a ancho<\/a><\/noindex>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"#prosteyshiy-primer-privedeniya-tablicy-k-shirokomu-formatu\">Ejemplo m\u00e1s simple de conversi\u00f3n de una tabla a formato ancho<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#generaciya-imeni-stolbca-iz-neskolkih-ishodnyh-peremennyh\">Generaci\u00f3n del nombre de columna a partir de m\u00faltiples variables de origen<\/a><\/noindex><\/li>\n<\/ul>\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#neskolko-prodvinutyh-primerov-raboty-s-novoy-koncepciey-tidyr\">Algunos ejemplos avanzados de trabajo con el nuevo concepto de 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\">Convertir datos en un formato limpio utilizando un conjunto de datos sobre la encuesta de ingresos y rentas en EE. UU.<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#vsemirnyy-bank\">Banco Mundial<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#spisok-kontaktov\">Lista de contactos<\/a><\/noindex><\/li>\n<\/ul>\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#zaklyuchenie\">Conclusi\u00f3n<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"koncepciya-tidydata\">La concepci\u00f3n de TidyData<\/h2>\n<p><\/p>\n<p>El objetivo <strong>tidyr<\/strong> \u2014 ayudarle a convertir datos en lo que se denomina un formato limpio. Los datos limpios son aquellos donde: <\/p>\n<p><\/p>\n<ul>\n<li>Cada variable est\u00e1 en una columna. <\/li>\n<li>Cada observaci\u00f3n es una fila. <\/li>\n<li>Cada valor es una celda.<\/li>\n<\/ul>\n<p><\/p>\n<p>Trabajar con datos que han sido convertidos a tidy data es significativamente m\u00e1s f\u00e1cil y conveniente durante el an\u00e1lisis.<\/p>\n<p><\/p>\n<h2 id=\"osnovnye-funkcii-vhodyaschie-v-paket-tidyr\">Funciones principales incluidas en el paquete tidyr<\/h2>\n<p><\/p>\n<p>tidyr contiene un conjunto de funciones dise\u00f1adas para transformar tablas:<\/p>\n<p><\/p>\n<ul>\n<li><code>fill()<\/code> \u2014 rellena valores faltantes en una columna con los valores anteriores;<\/li>\n<li><code>separate()<\/code> \u2014 divide un campo en varios a trav\u00e9s de un delimitador;<\/li>\n<li><code>unite()<\/code> \u2014 realiza la operaci\u00f3n de unir varios campos en uno, la acci\u00f3n inversa de la funci\u00f3n <code>separate()<\/code>;<\/li>\n<li><code>pivot_longer()<\/code> \u2014 funci\u00f3n que convierte datos de formato ancho a largo;<\/li>\n<li><code>pivot_wider()<\/code> \u2014 funci\u00f3n que transforma datos de formato largo a ancho. Es una operaci\u00f3n inversa a la que realiza la funci\u00f3n <code>pivot_longer()<\/code>.<\/li>\n<li><code>gather()<\/code><strong>obsoleta<\/strong> \u2014 funci\u00f3n que convierte datos de formato ancho a largo;<\/li>\n<li><code>spread()<\/code><strong>obsoleta<\/strong> \u2014 funci\u00f3n que transforma datos de formato largo a ancho. Es una operaci\u00f3n inversa a la que realiza la funci\u00f3n <code>gather()<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"novaya-koncepciya-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy-i-naoborot\">Un nuevo concepto para convertir datos de un formato ancho a un formato largo y viceversa<\/h2>\n<p><\/p>\n<p>Anteriormente, se utilizaban funciones para este tipo de transformaci\u00f3n <code>gather()<\/code> y <code>spread()<\/code>. Con los a\u00f1os que han pasado desde la creaci\u00f3n de estas funciones, se volvi\u00f3 evidente que para la mayor\u00eda de los usuarios, incluido el autor del paquete, los nombres de estas funciones y sus argumentos no eran muy claros y causaban dificultades en su b\u00fasqueda y comprensi\u00f3n sobre cu\u00e1l de estas funciones transforma un marco de datos de ancho a largo, y viceversa.<\/p>\n<p><\/p>\n<p>Por lo tanto, se <strong>tidyr<\/strong> agregaron dos nuevas funciones importantes, destinadas a la transformaci\u00f3n de marcos de datos.<\/p>\n<p><\/p>\n<p>Las nuevas funciones <code>pivot_longer()<\/code> y <code>pivot_wider()<\/code> se crearon inspiradas en algunas funciones del paquete <strong>cdata<\/strong>, desarrollado por John Mount y Nina Zumel.<\/p>\n<p><\/p>\n<h3 id=\"ustanovka-naibolee-aktualnoy-versii-tidyr-0839000\">Instalaci\u00f3n de la versi\u00f3n m\u00e1s reciente de tidyr 0.8.3.9000<\/h3>\n<p><\/p>\n<p>Para instalar la versi\u00f3n m\u00e1s reciente del paquete <strong>tidyr<\/strong> <em>0.8.3.9000<\/em>, en la que est\u00e1n disponibles las nuevas funciones, utiliza el siguiente c\u00f3digo.<\/p>\n<p><\/p>\n<p><code>devtools::install_github(\"tidyverse\/tidyr\")<\/code><\/p>\n<p><\/p>\n<p>Al momento de escribir este art\u00edculo, estas funciones solo est\u00e1n disponibles en la versi\u00f3n dev del paquete en GitHub.<\/p>\n<p><\/p>\n<h3 id=\"perehod-na-novye-funkcii\">Transici\u00f3n a nuevas funciones<\/h3>\n<p><\/p>\n<p>De hecho, no es dif\u00edcil convertir scripts antiguos a trabajar con las nuevas funciones. Para mayor comprensi\u00f3n, tomar\u00e9 un ejemplo de la documentaci\u00f3n de las funciones antiguas y mostrar\u00e9 c\u00f3mo se realizan las mismas operaciones usando las nuevas <code>pivot_*()<\/code> funciones.<\/p>\n<p><\/p>\n<p>Transformaci\u00f3n de formato ancho a largo.<\/p>\n<p>\n<b class=\"spoiler_title\">Ejemplo de c\u00f3digo de la documentaci\u00f3n de la funci\u00f3n 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>Transformaci\u00f3n de formato largo a ancho.<\/p>\n<p>\n<b class=\"spoiler_title\">Ejemplo de c\u00f3digo de la documentaci\u00f3n de la funci\u00f3n 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>Dado que en los ejemplos anteriores se trabaj\u00f3 con <code>pivot_longer()<\/code> y <code>pivot_wider()<\/code>, en la tabla original <em>stocks<\/em> no hay columnas enumeradas en los argumentos <em>names_to<\/em> y <em>values_to<\/em> sus nombres deben estar entre comillas.<\/p>\n<p><\/p>\n<p>Una tabla que te ayudar\u00e1 a entender mejor c\u00f3mo pasar a trabajar con el nuevo concepto <strong>tidyr<\/strong>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"El paquete R tidyr y sus nuevas funciones pivot_longer y 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\">Nota del autor<\/h2>\n<p><\/p>\n<blockquote><p>Todo el texto proporcionado a continuaci\u00f3n es una adaptaci\u00f3n, incluso podr\u00eda decirse que es una traducci\u00f3n libre de <noindex><a rel=\"nofollow\" href=\"https:\/\/tidyr.tidyverse.org\/dev\/articles\/pivot.html\">vi\u00f1etas<\/a><\/noindex> del sitio oficial de la biblioteca tidyverse.<\/p><\/blockquote>\n<p><\/p>\n<h2 id=\"prostoy-primer-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy\">Un ejemplo simple de conversi\u00f3n de datos de formato ancho a largo<\/h2>\n<p><\/p>\n<p><code>pivot_longer ()<\/code> \u2014 hace que los conjuntos de datos sean m\u00e1s largos, reduciendo la cantidad de columnas y aumentando la cantidad de filas.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"El paquete R tidyr y sus nuevas funciones pivot_longer y pivot_wider\" src=\"\/wp-content\/uploads\/2020\/04\/fc88b99f2fecdcdaa6179d2e7d29e59d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Para ejecutar los ejemplos presentados en el art\u00edculo, primero debes cargar los paquetes necesarios:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">library(tidyr)\nlibrary(dplyr)\nlibrary(readr)<\/code><\/pre>\n<p><\/p>\n<p>Supongamos que tenemos una tabla con los resultados de una encuesta, en la que (entre otras cosas) se pregunt\u00f3 a las personas sobre su religi\u00f3n y su ingreso anual:<\/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>Esta tabla contiene datos sobre la religi\u00f3n de los encuestados en las filas, mientras que el nivel de ingresos se distribuye en los nombres de las columnas. La cantidad de encuestados de cada categor\u00eda se almacena en los valores de las celdas en la intersecci\u00f3n de la religi\u00f3n y el nivel de ingresos. Para llevar la tabla a un formato ordenado y correcto, basta con utilizar <code>pivot_longer()<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">pew %&gt;% \n  pivot_longer(cols = -religion, names_to = \"ingresos\", values_to = \"cuenta\")<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">pew %&gt;% \n  pivot_longer(cols = -religion, names_to = \"ingresos\", values_to = \"cuenta\")\n#&gt; # Un tibble: 180 x 3\n#&gt;    religi\u00f3n ingresos             cuenta\n#&gt;                      \n#&gt;  1 Agn\u00f3stico   2 Agn\u00f3stico $10-20k               34\n#&gt;  3 Agn\u00f3stico $20-30k               60\n#&gt;  4 Agn\u00f3stico $30-40k               81\n#&gt;  5 Agn\u00f3stico $40-50k               76\n#&gt;  6 Agn\u00f3stico $50-75k              137\n#&gt;  7 Agn\u00f3stico $75-100k             122\n#&gt;  8 Agn\u00f3stico $100-150k            109\n#&gt;  9 Agn\u00f3stico &gt;150k                 84\n#&gt; 10 Agn\u00f3stico No sabe\/rechazado    96\n#&gt; # \u2026 con 170 filas m\u00e1s<\/code><\/pre>\n<p><\/p>\n<p>Argumentos de la funci\u00f3n <code>pivot_longer()<\/code><\/p>\n<p><\/p>\n<ul>\n<li>Primer argumento <em>cols<\/em>, describe qu\u00e9 columnas deben combinarse. En este caso, todas las columnas, excepto <em>time<\/em>.<\/li>\n<li>El argumento <em>names_to<\/em> nombra la variable que se crear\u00e1 a partir de los nombres de las columnas que hemos combinado.<\/li>\n<li><em>values_to<\/em> nombra la variable que se crear\u00e1 a partir de los datos almacenados en los valores de las celdas de las columnas combinadas.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"specifikacii\">Especificaciones<\/h2>\n<p><\/p>\n<p>Esta es una nueva funcionalidad del paquete <strong>tidyr<\/strong>, que anteriormente no estaba disponible cuando se trabajaba con funciones obsoletas.<\/p>\n<p><\/p>\n<p>La especificaci\u00f3n es un marco de datos, cada fila de la cual corresponde a una columna en el nuevo marco de datos de salida, y dos columnas especiales que comienzan con: <\/p>\n<p><\/p>\n<ul>\n<li><em>.name<\/em> contiene el nombre original de la columna. <\/li>\n<li><em>.value<\/em> contiene el nombre de la columna en la que se incluir\u00e1n los valores de las celdas. <\/li>\n<\/ul>\n<p><\/p>\n<p>Las restantes columnas de la especificaci\u00f3n reflejan c\u00f3mo se mostrar\u00e1 el nombre de las columnas comprimidas en la nueva columna de <em>.name<\/em>.<\/p>\n<p><\/p>\n<p>La especificaci\u00f3n describe los metadatos almacenados en el nombre de la columna, con una l\u00ednea para cada columna y una columna para cada variable combinada con el nombre de la columna; puede parecer que esta definici\u00f3n es confusa ahora, pero despu\u00e9s de revisar algunos ejemplos, todo ser\u00e1 mucho m\u00e1s claro.<\/p>\n<p><\/p>\n<p>El prop\u00f3sito de la especificaci\u00f3n es que puedes extraer, modificar y establecer nuevos metadatos al marco de datos que se est\u00e1 transformando.<\/p>\n<p><\/p>\n<p>Para trabajar con especificaciones al transformar la tabla de un formato ancho a largo, se utiliza la funci\u00f3n <code>pivot_longer_spec()<\/code>.<\/p>\n<p><\/p>\n<p>C\u00f3mo funciona esta funci\u00f3n, toma cualquier marco de datos y forma sus metadatos de la forma descrita anteriormente. <\/p>\n<p><\/p>\n<p>Por ejemplo, tomemos el conjunto de datos who, que se proporciona junto con el paquete. <strong>tidyr<\/strong>Este conjunto de datos contiene informaci\u00f3n proporcionada por la organizaci\u00f3n mundial de la salud sobre la incidencia de la tuberculosis.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">who\n#&gt; # Un tibble: 7,240 x 60\n#&gt;    pa\u00eds iso2  iso3   a\u00f1o nuevos_sp_m014 nuevos_sp_m1524 nuevos_sp_m2534\n#&gt;        &lt;chr&gt; &lt;int&gt;       &lt;int&gt;        &lt;int&gt;        &lt;int&gt;\n#&gt;  1 Afgan\u2026 AF    AFG    1980          NA           NA           NA\n#&gt;  2 Afgan\u2026 AF    AFG    1981          NA           NA           NA\n#&gt;  3 Afgan\u2026 AF    AFG    1982          NA           NA           NA\n#&gt;  4 Afgan\u2026 AF    AFG    1983          NA           NA           NA\n#&gt;  5 Afgan\u2026 AF    AFG    1984          NA           NA           NA\n#&gt;  6 Afgan\u2026 AF    AFG    1985          NA           NA           NA\n#&gt;  7 Afgan\u2026 AF    AFG    1986          NA           NA           NA\n#&gt;  8 Afgan\u2026 AF    AFG    1987          NA           NA           NA\n#&gt;  9 Afgan\u2026 AF    AFG    1988          NA           NA           NA\n#&gt; 10 Afgan\u2026 AF    AFG    1989          NA           NA           NA\n#&gt; # \u2026 con 7,230 filas m\u00e1s, y 53 variables m\u00e1s<\/code><\/pre>\n<p><\/p>\n<p>Construyamos su especificaci\u00f3n.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec %\n  pivot_longer_spec(new_sp_m014:newrel_f65, values_to = \"cuenta\")<\/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>Campos <em>pa\u00eds<\/em>, <em>iso2<\/em>, <em>iso3<\/em> ya son variables. Nuestra tarea es invertir las columnas con <em>nuevos_sp_m014<\/em> en <em>nuevosrel_f65<\/em>.<\/p>\n<p><\/p>\n<p>En los nombres de estas columnas se almacena la siguiente informaci\u00f3n:<\/p>\n<p><\/p>\n<ul>\n<li>Prefijo <code>nuevo_<\/code> indica que la columna contiene datos sobre nuevos casos de tuberculosis; el marco de datos actual solo contiene informaci\u00f3n sobre nuevas enfermedades, por lo que este prefijo no tiene carga sem\u00e1ntica en el contexto actual.<\/li>\n<li><code>sp<\/code>\/<code>rel<\/code>\/<code>sp<\/code>\/<code>ep<\/code> describe el m\u00e9todo de diagn\u00f3stico de la enfermedad.<\/li>\n<li><code>m<\/code>\/<code>f<\/code> g\u00e9nero del paciente.<\/li>\n<li><code>014<\/code>\/<code>1524<\/code>\/<code>2535<\/code>\/<code>3544<\/code>\/<code>4554<\/code>\/<code>65<\/code> rango de edad del paciente.<\/li>\n<\/ul>\n<p><\/p>\n<p>Podemos dividir estas columnas usando la funci\u00f3n <code>extract()<\/code>, utilizando expresiones regulares.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec %\n        extract(name, c(\"diagn\u00f3stico\", \"g\u00e9nero\", \"edad\"), \"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>Nota que la columna <em>.name<\/em> debe permanecer sin cambios, ya que es nuestro \u00edndice en los nombres de columnas del conjunto de datos original. <\/p>\n<p><\/p>\n<p>El g\u00e9nero y la edad (columnas <em>g\u00e9nero<\/em> y <em>edad<\/em>) tienen valores fijos y conocidos, por lo que se recomienda convertir estas columnas en factores:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec %\n            mutate(\n              g\u00e9nero = factor(g\u00e9nero, levels = c(\"f\", \"m\")),\n              edad = factor(edad, levels = unique(edad), ordered = TRUE)\n            ) <\/code><\/pre>\n<p><\/p>\n<p>Finalmente, para aplicar la especificaci\u00f3n que hemos creado al marco de datos original <em>who<\/em> necesitamos usar el argumento <em>spec<\/em> en la funci\u00f3n <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>Todo lo que acabamos de hacer se puede representar esquem\u00e1ticamente de la siguiente manera:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"El paquete R tidyr y sus nuevas funciones pivot_longer y 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\">Especificaci\u00f3n utilizando m\u00faltiples valores (.value)<\/h2>\n<p><\/p>\n<p>En el ejemplo anterior, la columna de especificaciones <em>.value<\/em> solo conten\u00eda un solo valor, lo cual es com\u00fan en la mayor\u00eda de los casos. <\/p>\n<p><\/p>\n<p>Sin embargo, ocasionalmente puede surgir una situaci\u00f3n en la que necesite reunir datos de columnas con diferentes tipos de datos. Usando una funci\u00f3n obsoleta, <code>spread()<\/code> esto ser\u00eda bastante complicado de hacer.<\/p>\n<p><\/p>\n<p>El siguiente ejemplo se toma de <noindex><a rel=\"nofollow\" href=\"https:\/\/cran.r-project.org\/web\/packages\/data.table\/vignettes\/datatable-reshape.html\">vi\u00f1etas<\/a><\/noindex> el paquete <strong>data.table<\/strong>.<\/p>\n<p><\/p>\n<p>Vamos a crear un marco de datos de entrenamiento.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">familia &lt;- tibble::tribble(\n  ~familia,  ~dob_hijo1,  ~dob_hijo2, ~g\u00e9nero_hijo1, ~g\u00e9nero_hijo2,\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)\nfamilia % 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>El marco de datos creado contiene en cada fila la informaci\u00f3n sobre los hijos de una misma familia. Las familias pueden tener uno o dos hijos. Para cada hijo se proporcionan datos sobre la fecha de nacimiento y el g\u00e9nero, y la informaci\u00f3n de cada hijo se almacena en columnas separadas; nuestra tarea es ajustar estos datos al formato correcto para el an\u00e1lisis.<\/p>\n<p><\/p>\n<p>Tenga en cuenta que tenemos dos variables con informaci\u00f3n sobre cada ni\u00f1o: su g\u00e9nero y fecha de nacimiento (las columnas con el prefijo <em>dop<\/em> contienen la fecha de nacimiento, las columnas con el prefijo <em>g\u00e9nero<\/em> contienen el g\u00e9nero del ni\u00f1o). En el resultado esperado, deben ir en columnas separadas. Podemos lograr esto generando una especificaci\u00f3n en la que la columna <code>.value<\/code> tenga dos valores diferentes.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec %\n  pivot_longer_spec(-familia) %&gt;%\n  separate(col = name, into = c(\".value\", \"hijo\")) %&gt;%\n  mutate(hijo = parse_number(hijo))\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>Entonces, desglosamos paso a paso las acciones que realiza el c\u00f3digo anterior.<\/p>\n<p><\/p>\n<ul>\n<li><code>pivot_longer_spec(-family)<\/code> \u2014 creamos una especificaci\u00f3n que compacta todas las columnas disponibles excepto la columna family.<\/li>\n<li><code>separate(col = name, into = c(\".value\", \"hijo\"))<\/code> \u2014 separamos la columna <em>.name<\/em>, que contiene los nombres de los campos originales, por los guiones bajos y almacenamos los valores obtenidos en columnas. <em>.value<\/em> y <em>child<\/em>.<\/li>\n<li><code>mutate(child = parse_number(child))<\/code> \u2014 convertimos los valores del campo <em>child<\/em> de tipo texto a num\u00e9rico.<\/li>\n<\/ul>\n<p><\/p>\n<p>Ahora podemos aplicar la especificaci\u00f3n obtenida al marco de datos original y transformar la tabla al formato deseado.<\/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>Usamos el argumento <code>na.rm = TRUE<\/code>, porque la forma actual de los datos obliga a crear filas adicionales para observaciones inexistentes. Dado que la familia 2 tiene solo un ni\u00f1o, <code>na.rm = TRUE<\/code> asegura que la familia 2 tendr\u00e1 una fila en la salida.<\/p>\n<p><\/p>\n<h2 id=\"preobrazovanie-data-freymov-iz-dlinnogo-formata-k-shirokomu\">Conversi\u00f3n de data frames de formato largo a ancho<\/h2>\n<p><\/p>\n<p><code>pivot_wider()<\/code> \u2014 es la transformaci\u00f3n inversa, y a su vez aumenta el n\u00famero de columnas del marco de datos reduciendo el n\u00famero de filas.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"El paquete R tidyr y sus nuevas funciones pivot_longer y pivot_wider\" src=\"\/wp-content\/uploads\/2020\/04\/b470664e06f362d6f0ea6df9c1ed426d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Este tipo de transformaci\u00f3n se utiliza extremadamente rara vez para organizar los datos de manera ordenada, sin embargo, esta t\u00e9cnica puede ser \u00fatil para crear tablas resumen que se utilizan en presentaciones, o para integrarse con otras herramientas.<\/p>\n<p><\/p>\n<p>De hecho, las funciones <code>pivot_longer()<\/code> y <code>pivot_wider()<\/code> son sim\u00e9tricas y realizan acciones opuestas entre s\u00ed, es decir: <code>df %&gt;% pivot_longer(spec = spec) %&gt;% pivot_wider(spec = spec)<\/code> y <code>df %&gt;% pivot_wider(spec = spec) %&gt;% pivot_longer(spec = spec)<\/code> devolver\u00e1 el df original.<\/p>\n<p><\/p>\n<h3 id=\"prosteyshiy-primer-privedeniya-tablicy-k-shirokomu-formatu\">Ejemplo m\u00e1s simple de conversi\u00f3n de una tabla a formato ancho<\/h3>\n<p><\/p>\n<p>Para demostrar el funcionamiento de la funci\u00f3n <code>pivot_wider()<\/code> utilizaremos el conjunto de datos <em>fish_encounters<\/em>, que contiene informaci\u00f3n sobre c\u00f3mo varias estaciones registran el movimiento de los peces a lo largo del r\u00edo.<\/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>En la mayor\u00eda de los casos, esta tabla ser\u00e1 m\u00e1s informativa y conveniente de usar si se presenta la informaci\u00f3n de cada estaci\u00f3n en una columna separada.<\/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;\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 con 9 filas m\u00e1s y 1 variable m\u00e1s: MAW<\/code><\/pre>\n<p><\/p>\n<p>Este conjunto de datos registra informaci\u00f3n solo en los casos en que un pez fue detectado por una estaci\u00f3n, es decir, si alg\u00fan pez no fue registrado por alguna estaci\u00f3n, entonces no habr\u00e1 datos en la tabla. Esto significa que los datos de salida estar\u00e1n llenos de NA. <\/p>\n<p><\/p>\n<p>Sin embargo, en este caso sabemos que la falta de registro significa que el pez no fue visto, por lo que podemos usar el argumento <em>values_fill<\/em> en la funci\u00f3n <code>pivot_wider()<\/code> y llenar estos valores faltantes con ceros:<\/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\">Generaci\u00f3n del nombre de columna a partir de m\u00faltiples variables de origen<\/h3>\n<p><\/p>\n<p>Imagina que tenemos una tabla que contiene combinaciones de producto, pa\u00eds y a\u00f1o. Para generar un marco de datos de prueba, puedes ejecutar el siguiente c\u00f3digo:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">df %\n  filter((producto == \"A\" &amp; pa\u00eds == \"AI\") | producto == \"B\") %&gt;% \n  mutate(valor = 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>Nuestra tarea es expandir el marco de datos de manera que una columna contenga datos para cada combinaci\u00f3n de producto y pa\u00eds. Para esto, basta con pasar el argumento <em>names_from<\/em> un vector que contiene los nombres de los campos que se combinar\u00e1n.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">df %&gt;% pivot_wider(names_from = c(producto, pa\u00eds),\n                 values_from = \"valor\")<\/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>Tambi\u00e9n puedes aplicar especificaciones a la funci\u00f3n <code>pivot_wider()<\/code>. Pero al introducir en <code>pivot_wider()<\/code> la especificaci\u00f3n realiza la transformaci\u00f3n opuesta <code>pivot_longer()<\/code>: se crean columnas, indicadas en <em>.name<\/em>, utilizando valores de <em>.value<\/em> y otras columnas.<\/p>\n<p><\/p>\n<p>Para este conjunto de datos, puedes generar una especificaci\u00f3n personalizada si deseas que cada posible combinaci\u00f3n de pa\u00eds y producto tenga su propia columna, en lugar de solo aquellas que est\u00e1n presentes en los datos:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec % \n  expand(producto, pa\u00eds, .value = \"valor\") %&gt;% \n  unite(\".name\", producto, pa\u00eds, 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\">Algunos ejemplos avanzados de trabajo con el nuevo concepto de 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\">Convertir datos en un formato limpio utilizando un conjunto de datos sobre la encuesta de ingresos y rentas en EE. UU.<\/h3>\n<p><\/p>\n<p>Conjunto de datos <em>us_rent_income<\/em> contiene informaci\u00f3n sobre el ingreso medio y el alquiler en cada estado de EE.UU. para el a\u00f1o 2017 (el conjunto de datos est\u00e1 disponible en el paquete <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 con 94 filas m\u00e1s<\/code><\/pre>\n<p><\/p>\n<p>En la forma en que se almacenan los datos en el conjunto de datos <em>us_rent_income<\/em> es extremadamente inc\u00f3modo trabajar con ellos, por lo que quisi\u00e9ramos crear un conjunto de datos con columnas: <em>rent<\/em>, <em>rent_moe<\/em>, <em>come<\/em>, <em>income_moe<\/em>. Hay muchas formas de crear esta especificaci\u00f3n, pero lo principal es que necesitamos generar cada combinaci\u00f3n de valores de la variable y <em>estimate\/moe<\/em>, y luego generar el nombre de la columna.<\/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>Proporcionar esta especificaci\u00f3n <code>pivot_wider()<\/code> nos da el resultado que buscamos:<\/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\">Banco Mundial<\/h3>\n<p><\/p>\n<p>A veces, dar formato a un conjunto de datos requiere varios pasos.<br \/>\nConjunto de Datos <em>world_bank_pop<\/em> contiene datos del banco mundial sobre la poblaci\u00f3n de cada pa\u00eds desde el a\u00f1o 2000 hasta 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>Nuestro objetivo es crear un conjunto de datos ordenado, donde cada variable est\u00e9 en una columna separada. A\u00fan no est\u00e1 claro qu\u00e9 pasos exactos son necesarios, pero comenzaremos con el problema m\u00e1s obvio: el a\u00f1o est\u00e1 distribuido en varias columnas.<\/p>\n<p><\/p>\n<p>Para corregir esto, es necesario utilizar la funci\u00f3n <code>pivot_longer()<\/code>.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">pop2 % \n  pivot_longer(`2000`:`2017`, names_to = \"a\u00f1o\")<\/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>El siguiente paso es considerar la variable indicador.<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>Donde SP.POP.GROW es el crecimiento poblacional, SP.POP.TOTL es la poblaci\u00f3n total, y SP.URB. * es lo mismo, pero solo para \u00e1reas urbanas. Vamos a dividir estos valores en dos variables: area \u2014 tipo de \u00e1rea (total o urbana) y una variable que contenga los datos reales (poblaci\u00f3n o crecimiento):<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">pop3 % \n  separate(indicator, c(NA, \"\u00e1rea\", \"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>Ahora solo nos queda dividir la variable variable en dos columnas:<\/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\">Lista de contactos<\/h3>\n<p><\/p>\n<p>\u00daltimo ejemplo, imagina que tienes una lista de contactos que copiaste y pegaste de un sitio web:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">contactos &lt;- tribble(\n  ~campo, ~valor,\n  &quot;nombre&quot;, &quot;Jiena McLellan&quot;,\n  &quot;empresa&quot;, &quot;Toyota&quot;, \n  &quot;nombre&quot;, &quot;John Smith&quot;, \n  &quot;empresa&quot;, &quot;google&quot;, \n  &quot;correo&quot;, &quot;john@google.com&quot;,\n  &quot;nombre&quot;, &quot;Huxley Ratcliffe&quot;\n)<\/code><\/pre>\n<p><\/p>\n<p>Es bastante complicado presentar esta lista en forma de tabla, ya que no hay una variable que identifique qu\u00e9 datos pertenecen a qu\u00e9 contacto. Podemos corregir esto, observando que los datos de cada nuevo contacto comienzan con el nombre (&quot;name&quot;), por lo que podemos crear un identificador \u00fanico y aumentarlo en uno cada vez que aparezca el valor \u201cname\u201d en la columna field:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">contacts &lt;- contacts %&gt;% \n  mutate(\n    person_id = cumsum(field == &quot;name&quot;)\n  )\ncontacts<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 6 x 3\n#&gt;   field   value            person_id\n#&gt;   &lt;chr&gt;   &lt;chr&gt;                &lt;int&gt;\n#&gt; 1 name    Jiena McLellan           1\n#&gt; 2 company Toyota                   1\n#&gt; 3 name    John Smith               2\n#&gt; 4 company google                   2\n#&gt; 5 email   john@google.com          2\n#&gt; 6 name    Huxley Ratcliffe         3<\/code><\/pre>\n<p><\/p>\n<p>Ahora que tenemos un identificador \u00fanico para cada contacto, podemos pivotar el campo y el valor en columnas:<\/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\">Conclusi\u00f3n<\/h2>\n<p><\/p>\n<p>En mi opini\u00f3n personal, la nueva concepci\u00f3n <strong>tidyr<\/strong> es realmente intuitivamente m\u00e1s clara, y supera considerablemente en funcionalidad a las funciones obsoletas <code>spread()<\/code> y <code>gather()<\/code>. Espero que este art\u00edculo te haya ayudado a entender <code>pivot_longer()<\/code> y <code>pivot_wider()<\/code>.<\/p>\n<p>Fuente: <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.2 - 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\/es\/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.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\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\/es\/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\udd47Paquete R tidyr y sus nuevas funciones pivot_longer y pivot_wider | ProHoster","description":"El paquete tidyr forma parte del n\u00facleo de una de las bibliotecas m\u00e1s populares en el lenguaje R: tidyverse. Su principal funci\u00f3n es transformar los datos en un formato ordenado. En Habr.","canonical_url":"https:\/\/prohoster.info\/es\/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":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/76291","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=76291"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/76291\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/76292"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=76291"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=76291"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=76291"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}