{"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\/pt\/blog\/administrirovanie\/r-paket-tidyr-i-ego-novye-funkczii-pivot_longer-i-pivot_wider","title":{"rendered":"O pacote tidyr e suas novas fun\u00e7\u00f5es pivot_longer e pivot_wider","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Pacote <strong>tidyr<\/strong> faz parte do n\u00facleo de uma das bibliotecas mais populares na linguagem R \u2014 <strong>tidyverse<\/strong>.<br \/>\nA principal finalidade do pacote \u00e9 deixar os dados em um formato organizado.<\/p>\n<p><\/p>\n<p>No Habr j\u00e1 existe <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/248741\/\">publica\u00e7\u00e3o<\/a><\/noindex> dedicada a este pacote, mas data de 2015. Quero falar sobre as mudan\u00e7as mais atualizadas que seu autor, Hadley Wickham, informou h\u00e1 alguns dias.<\/p>\n<p>\n<img decoding=\"async\" alt=\"O pacote tidyr e suas novas fun\u00e7\u00f5es pivot_longer e pivot_wider\" src=\"\/wp-content\/uploads\/2020\/04\/a290263b63aaea3db70e83a1ec411415.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<blockquote><p><b>SJK<\/b>: As fun\u00e7\u00f5es gather() e spread() ser\u00e3o consideradas obsoletas?<\/p>\n<p><b>Hadley Wickham<\/b>: De certa forma. Pararemos de recomendar o uso dessas fun\u00e7\u00f5es e de corrigir seus erros, mas elas continuar\u00e3o presentes no pacote em seu estado atual.<\/p><\/blockquote>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"soderzhanie\">Conte\u00fado<\/h2>\n<p><\/p>\n<p><em>youtube <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/R4marketing\">telegram<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/R4marketing\/?sub_confirmation=1\">canais. A maior parte do conte\u00fado \u00e9 dedicada \u00e0 linguagem R.<\/a><\/noindex> canais. A maior parte do conte\u00fado deles \u00e9 dedicado \u00e0 linguagem R.<\/em><\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"#koncepciya-tidydata\">Conceito TidyData<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#osnovnye-funkcii-vhodyaschie-v-paket-tydir\">As principais fun\u00e7\u00f5es inclu\u00eddas no pacote tidyr<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#novaya-koncepciya-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy-i-naoborot\">O novo conceito de transforma\u00e7\u00e3o de dados do formato largo para o longo e vice-versa<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/ustnovka-naibolee-aktualnoy-versii-tidyr-0839000\">Instalando a vers\u00e3o mais atual do tidyr 0.8.3.9000<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#perehod-na-novye-funkcii\">Transi\u00e7\u00e3o para novas fun\u00e7\u00f5es<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#prostoy-primer-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy\">Um exemplo simples de transforma\u00e7\u00e3o de dados do formato largo para o longo<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#specifikacii\">Especifica\u00e7\u00f5es<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#specifikaciya-s-ispolzovaniem-neskolkih-znacheniyvalue\">Especifica\u00e7\u00e3o usando v\u00e1rios valores (.value)<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#preobrazovanie-data-freymov-iz-dlinnogo-formata-k-shirokomu\">Transforma\u00e7\u00e3o de data frames do formato longo para o largo<\/a><\/noindex>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"#prosteyshiy-primer-privedeniya-tablicy-k-shirokomu-formatu\">Um exemplo b\u00e1sico de como deixar uma tabela em formato largo<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#generaciya-imeni-stolbca-iz-neskolkih-ishodnyh-peremennyh\">Gera\u00e7\u00e3o do nome da coluna a partir de v\u00e1rias vari\u00e1veis de origem<\/a><\/noindex><\/li>\n<\/ul>\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#neskolko-prodvinutyh-primerov-raboty-s-novoy-koncepciey-tidyr\">V\u00e1rios exemplos avan\u00e7ados de trabalho com o novo conceito do 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\">Organizando dados com o exemplo do conjunto de dados sobre a renda e aluguel nos EUA<\/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 contatos<\/a><\/noindex><\/li>\n<\/ul>\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#zaklyuchenie\">Conclus\u00e3o<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"koncepciya-tidydata\">Conceito TidyData<\/h2>\n<p><\/p>\n<p>O objetivo <strong>tidyr<\/strong> \u2014 para ajud\u00e1-lo a organizar seus dados em um formato chamado tidy. Dados organizados s\u00e3o aqueles onde: <\/p>\n<p><\/p>\n<ul>\n<li>Cada vari\u00e1vel est\u00e1 em uma coluna. <\/li>\n<li>Cada observa\u00e7\u00e3o \u00e9 uma linha. <\/li>\n<li>Cada valor \u00e9 uma c\u00e9lula.<\/li>\n<\/ul>\n<p><\/p>\n<p>Trabalhar com dados organizados (tidy data) \u00e9 significativamente mais f\u00e1cil e conveniente durante a an\u00e1lise.<\/p>\n<p><\/p>\n<h2 id=\"osnovnye-funkcii-vhodyaschie-v-paket-tidyr\">As principais fun\u00e7\u00f5es inclu\u00eddas no pacote tidyr<\/h2>\n<p><\/p>\n<p>O tidyr cont\u00e9m um conjunto de fun\u00e7\u00f5es destinadas \u00e0 transforma\u00e7\u00e3o de tabelas:<\/p>\n<p><\/p>\n<ul>\n<li><code>fill()<\/code> \u2014 preenche valores ausentes em uma coluna com os valores anteriores;<\/li>\n<li><code>separate()<\/code> \u2014 divide um campo em v\u00e1rios separados por um delimitador;<\/li>\n<li><code>unite()<\/code> \u2014 realiza a opera\u00e7\u00e3o de unir v\u00e1rios campos em um, uma a\u00e7\u00e3o oposta \u00e0 fun\u00e7\u00e3o <code>separate()<\/code>;<\/li>\n<li><code>pivot_longer()<\/code> \u2014 fun\u00e7\u00e3o que transforma dados do formato largo para o longo;<\/li>\n<li><code>pivot_wider()<\/code> \u2014 fun\u00e7\u00e3o que transforma dados do formato longo para o largo. Uma opera\u00e7\u00e3o contr\u00e1ria \u00e0 realizada pela fun\u00e7\u00e3o <code>pivot_longer()<\/code>.<\/li>\n<li><code>gather()<\/code><strong>obsoleta<\/strong> \u2014 fun\u00e7\u00e3o que transforma dados do formato largo para o longo;<\/li>\n<li><code>spread()<\/code><strong>obsoleta<\/strong> \u2014 fun\u00e7\u00e3o que transforma dados do formato longo para o largo. Uma opera\u00e7\u00e3o contr\u00e1ria \u00e0 realizada pela fun\u00e7\u00e3o <code>gather()<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"novaya-koncepciya-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy-i-naoborot\">O novo conceito de transforma\u00e7\u00e3o de dados do formato largo para o longo e vice-versa<\/h2>\n<p><\/p>\n<p>Anteriormente, fun\u00e7\u00f5es eram usadas para esse tipo de transforma\u00e7\u00e3o. <code>gather()<\/code> e <code>spread()<\/code>Ao longo dos anos, tornou-se evidente que, para a maioria dos usu\u00e1rios, incluindo o autor do pacote, os nomes dessas fun\u00e7\u00f5es e seus argumentos n\u00e3o eram muito claros, causando dificuldades na busca e na compreens\u00e3o de qual dessas fun\u00e7\u00f5es transforma um dataframe de formato largo para longo e vice-versa.<\/p>\n<p><\/p>\n<p>Por isso, foram adicionadas duas novas e importantes fun\u00e7\u00f5es em <strong>tidyr<\/strong> para a transforma\u00e7\u00e3o de dataframes.<\/p>\n<p><\/p>\n<p>As novas fun\u00e7\u00f5es <code>pivot_longer()<\/code> e <code>pivot_wider()<\/code> foram inspiradas por algumas fun\u00e7\u00f5es do pacote <strong>cdata<\/strong>, criado por John Mount e Nina Zumel.<\/p>\n<p><\/p>\n<h3 id=\"ustanovka-naibolee-aktualnoy-versii-tidyr-0839000\">Instalando a vers\u00e3o mais atual do tidyr 0.8.3.9000<\/h3>\n<p><\/p>\n<p>Para instalar a nova vers\u00e3o mais atual do pacote <strong>tidyr<\/strong> <em>0.8.3.9000<\/em>, que cont\u00e9m as novas fun\u00e7\u00f5es, utilize o seguinte c\u00f3digo.<\/p>\n<p><\/p>\n<p><code>devtools::install_github(\"tidyverse\/tidyr\")<\/code><\/p>\n<p><\/p>\n<p>No momento da reda\u00e7\u00e3o deste artigo, essas fun\u00e7\u00f5es est\u00e3o dispon\u00edveis apenas na vers\u00e3o dev do pacote no GitHub.<\/p>\n<p><\/p>\n<h3 id=\"perehod-na-novye-funkcii\">Transi\u00e7\u00e3o para novas fun\u00e7\u00f5es<\/h3>\n<p><\/p>\n<p>Na verdade, n\u00e3o \u00e9 dif\u00edcil converter scripts antigos para o uso das novas fun\u00e7\u00f5es; para maior compreens\u00e3o, pegarei um exemplo da documenta\u00e7\u00e3o das fun\u00e7\u00f5es antigas e mostrarei como essas opera\u00e7\u00f5es s\u00e3o realizadas com as novas <code>pivot_*()<\/code> fun\u00e7\u00f5es.<\/p>\n<p><\/p>\n<p>Transforma\u00e7\u00e3o de formato largo para longo.<\/p>\n<p>\n<b class=\"spoiler_title\">Exemplo de c\u00f3digo da documenta\u00e7\u00e3o da fun\u00e7\u00e3o 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>Transforma\u00e7\u00e3o de formato longo para largo.<\/p>\n<p>\n<b class=\"spoiler_title\">Exemplo de c\u00f3digo da documenta\u00e7\u00e3o da fun\u00e7\u00e3o 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>Como nos exemplos acima, na tabela original <code>pivot_longer()<\/code> e <code>pivot_wider()<\/code>stocks <em>n\u00e3o h\u00e1 colunas listadas nos argumentos<\/em> names_to <em>values_to<\/em> e <em>seus nomes precisam ser especificados entre aspas.<\/em> Uma tabela que facilitar\u00e1 a compreens\u00e3o de como transitar para a nova concep\u00e7\u00e3o<\/p>\n<p><\/p>\n<p>Todo o texto a seguir \u00e9 adaptativo, diria at\u00e9 que \u00e9 uma tradu\u00e7\u00e3o livre de <strong>tidyr<\/strong>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"O pacote tidyr e suas novas fun\u00e7\u00f5es pivot_longer e 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 do autor<\/h2>\n<p><\/p>\n<blockquote><p>vinhetas <noindex><a rel=\"nofollow\" href=\"https:\/\/tidyr.tidyverse.org\/dev\/articles\/pivot.html\">do site oficial da biblioteca tidyverse.<\/a><\/noindex> pivot_longer ()<\/p><\/blockquote>\n<p><\/p>\n<h2 id=\"prostoy-primer-preobrazovaniya-dannyh-iz-shirokogo-formata-v-dlinnyy\">Um exemplo simples de transforma\u00e7\u00e3o de dados do formato largo para o longo<\/h2>\n<p><\/p>\n<p><code>\u2014 torna conjuntos de dados mais longos, reduzindo o n\u00famero de colunas e aumentando o n\u00famero de linhas.<\/code> Para executar os exemplos apresentados no artigo, \u00e9 necess\u00e1rio inicialmente carregar os pacotes apropriados:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"O pacote tidyr e suas novas fun\u00e7\u00f5es pivot_longer e pivot_wider\" src=\"\/wp-content\/uploads\/2020\/04\/fc88b99f2fecdcdaa6179d2e7d29e59d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>library(tidyr)\nlibrary(dplyr)\nlibrary(readr)<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Suponha que temos uma tabela com os resultados de uma pesquisa, onde (entre outras coisas) perguntamos \u00e0s pessoas sobre suas cren\u00e7as religiosas e sua renda anual:<\/code><\/pre>\n<p><\/p>\n<p>Suponha que temos uma tabela com os resultados de uma pesquisa, na qual (entre outras coisas) perguntamos \u00e0s pessoas sobre sua religi\u00e3o e renda 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 tabela cont\u00e9m dados sobre a religi\u00e3o dos entrevistados nas linhas, enquanto o n\u00edvel de renda est\u00e1 distribu\u00eddo pelos nomes das colunas. O n\u00famero de entrevistados em cada categoria \u00e9 armazenado nos valores das c\u00e9lulas na interse\u00e7\u00e3o da religi\u00e3o e do n\u00edvel de renda. Para formatar a tabela de maneira adequada, basta utilizar <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 Agnostico   2 Agnostico $10-20k               34\n#&gt;  3 Agnostico $20-30k               60\n#&gt;  4 Agnostico $30-40k               81\n#&gt;  5 Agnostico $40-50k               76\n#&gt;  6 Agnostico $50-75k              137\n#&gt;  7 Agnostico $75-100k             122\n#&gt;  8 Agnostico $100-150k            109\n#&gt;  9 Agnostico &gt;150k                 84\n#&gt; 10 Agnostico N\u00e3o sabe\/se recusou    96\n#&gt; # \u2026 com 170 linhas a mais<\/code><\/pre>\n<p><\/p>\n<p>Argumentos da fun\u00e7\u00e3o <code>pivot_longer()<\/code><\/p>\n<p><\/p>\n<ul>\n<li>Primeiro argumento <em>cols<\/em>, descreve quais colunas devem ser combinadas. Neste caso, todas as colunas, exceto <em>time<\/em>.<\/li>\n<li>Argumento <em>values_to<\/em> d\u00e1 o nome da vari\u00e1vel que ser\u00e1 criada a partir dos nomes das colunas que unimos.<\/li>\n<li><em>seus nomes precisam ser especificados entre aspas.<\/em> d\u00e1 o nome da vari\u00e1vel que ser\u00e1 criada a partir dos dados armazenados nos valores das c\u00e9lulas das colunas combinadas.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"specifikacii\">Especifica\u00e7\u00f5es<\/h2>\n<p><\/p>\n<p>Esta \u00e9 uma nova funcionalidade do pacote <strong>tidyr<\/strong>, que anteriormente n\u00e3o estava dispon\u00edvel ao trabalhar com fun\u00e7\u00f5es obsoletas.<\/p>\n<p><\/p>\n<p>A especifica\u00e7\u00e3o \u00e9 um quadro de dados, onde cada linha corresponde a uma coluna no novo conjunto de dados de sa\u00edda, e duas colunas especiais que come\u00e7am com: <\/p>\n<p><\/p>\n<ul>\n<li><em>.name<\/em> cont\u00e9m o nome original da coluna. <\/li>\n<li><em>.value<\/em> cont\u00e9m o nome da coluna onde os valores das c\u00e9lulas ser\u00e3o inseridos. <\/li>\n<\/ul>\n<p><\/p>\n<p>As outras colunas da especifica\u00e7\u00e3o refletem como o nome das colunas comprimidas ser\u00e1 exibido na nova coluna. <em>.name<\/em>.<\/p>\n<p><\/p>\n<p>A especifica\u00e7\u00e3o descreve os metadados armazenados no nome da coluna, com uma linha para cada coluna e uma coluna para cada vari\u00e1vel unida ao nome da coluna; talvez essa defini\u00e7\u00e3o pare\u00e7a confusa agora, mas ap\u00f3s revisar alguns exemplos ficar\u00e1 muito mais clara.<\/p>\n<p><\/p>\n<p>O prop\u00f3sito da especifica\u00e7\u00e3o \u00e9 que voc\u00ea pode extrair, modificar e configurar novos metadados para o dataframe transformado.<\/p>\n<p><\/p>\n<p>Para trabalhar com especifica\u00e7\u00f5es ao converter uma tabela de formato largo para longo, utiliza-se a fun\u00e7\u00e3o <code>pivot_longer_spec()<\/code>.<\/p>\n<p><\/p>\n<p>Como essa fun\u00e7\u00e3o funciona, ela pega qualquer dataframe e forma seus metadados da maneira descrita acima. <\/p>\n<p><\/p>\n<p>Para exemplificar, vamos usar o conjunto de dados who, que \u00e9 fornecido junto com o pacote <strong>tidyr<\/strong>. Este conjunto de dados cont\u00e9m informa\u00e7\u00f5es fornecidas pela Organiza\u00e7\u00e3o Mundial da Sa\u00fade sobre a incid\u00eancia de tuberculose.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">who\n#&gt; # A tibble: 7,240 x 60\n#&gt;    country iso2  iso3   year new_sp_m014 new_sp_m1524 new_sp_m2534\n#&gt;        &amp;                        \n#&gt;  1 Afghan\u2026 AF    AFG    1980          NA           NA           NA\n#&gt;  2 Afghan\u2026 AF    AFG    1981          NA           NA           NA\n#&gt;  3 Afghan\u2026 AF    AFG    1982          NA           NA           NA\n#&gt;  4 Afghan\u2026 AF    AFG    1983          NA           NA           NA\n#&gt;  5 Afghan\u2026 AF    AFG    1984          NA           NA           NA\n#&gt;  6 Afghan\u2026 AF    AFG    1985          NA           NA           NA\n#&gt;  7 Afghan\u2026 AF    AFG    1986          NA           NA           NA\n#&gt;  8 Afghan\u2026 AF    AFG    1987          NA           NA           NA\n#&gt;  9 Afghan\u2026 AF    AFG    1988          NA           NA           NA\n#&gt; 10 Afghan\u2026 AF    AFG    1989          NA           NA           NA\n#&gt; # \u2026 com 7,230 mais linhas, e 53 mais vari\u00e1veis<\/code><\/pre>\n<p><\/p>\n<p>Vamos construir sua especifica\u00e7\u00e3o.<\/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>Campos <em>country<\/em>, <em>iso2<\/em>, <em>iso3<\/em> j\u00e1 s\u00e3o vari\u00e1veis. Nossa tarefa \u00e9 inverter as colunas de <em>new_sp_m014<\/em> para <em>newrel_f65<\/em>.<\/p>\n<p><\/p>\n<p>Nos nomes dessas colunas, as seguintes informa\u00e7\u00f5es est\u00e3o armazenadas:<\/p>\n<p><\/p>\n<ul>\n<li>Prefixo <code>new_<\/code> indica que a coluna cont\u00e9m dados sobre novos casos de tuberculose. O dataframe atual cont\u00e9m informa\u00e7\u00f5es apenas sobre novos casos, portanto, esse prefixo, no contexto atual, n\u00e3o carrega nenhum significado.<\/li>\n<li><code>sp<\/code>\/<code>rel<\/code>\/<code>sp<\/code>\/<code>ep<\/code> descreve o m\u00e9todo de diagn\u00f3stico da doen\u00e7a.<\/li>\n<li><code>m<\/code>\/<code>f<\/code> sexo do paciente.<\/li>\n<li><code>014<\/code>\/<code>1524<\/code>\/<code>2535<\/code>\/<code>3544<\/code>\/<code>4554<\/code>\/<code>65<\/code> faixa et\u00e1ria do paciente.<\/li>\n<\/ul>\n<p><\/p>\n<p>Podemos dividir essas colunas usando a fun\u00e7\u00e3o <code>extract()<\/code>, usando express\u00f5es regulares.<\/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>Note que a coluna <em>.name<\/em> deve permanecer inalterada, pois \u00e9 nosso \u00edndice nos nomes das colunas do conjunto de dados original. <\/p>\n<p><\/p>\n<p>Sexo e idade (colunas <em>gender<\/em> e <em>age<\/em>) t\u00eam valores fixos e conhecidos, portanto, \u00e9 recomend\u00e1vel transformar essas colunas em fatores:<\/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>Finalmente, para aplicar a especifica\u00e7\u00e3o que criamos ao dataframe original <em>who<\/em> precisamos usar o argumento <em>spec<\/em> na fun\u00e7\u00e3o <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>Tudo que acabamos de fazer pode ser esquematizado da seguinte forma:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"O pacote tidyr e suas novas fun\u00e7\u00f5es pivot_longer e 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\">Especifica\u00e7\u00e3o usando v\u00e1rios valores (.value)<\/h2>\n<p><\/p>\n<p>No exemplo acima, a coluna da especifica\u00e7\u00e3o <em>.value<\/em> cont\u00e9m apenas um valor, na maioria das vezes \u00e9 assim que acontece. <\/p>\n<p><\/p>\n<p>Mas ocasionalmente pode surgir a situa\u00e7\u00e3o em que voc\u00ea precisa coletar dados de colunas com diferentes tipos de dados. Com a fun\u00e7\u00e3o obsoleta <code>spread()<\/code> seria bastante dif\u00edcil fazer isso.<\/p>\n<p><\/p>\n<p>O exemplo abaixo \u00e9 extra\u00eddo de <noindex><a rel=\"nofollow\" href=\"https:\/\/cran.r-project.org\/web\/packages\/data.table\/vignettes\/datatable-reshape.html\">do site oficial da biblioteca tidyverse.<\/a><\/noindex> para o pacote <strong>data.table<\/strong>.<\/p>\n<p><\/p>\n<p>Vamos criar um data frame de treino.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">family &lt;- tibble::tribble(\n  ~family,  ~dob_child1,  ~dob_child2, ~gender_child1, ~gender_child2,\n       1L, &quot;1998-11-26&quot;, &quot;2000-01-29&quot;,             1L,             2L,\n       2L, &quot;1996-06-22&quot;,           NA,             2L,             NA,\n       3L, &quot;2002-07-11&quot;, &quot;2004-04-05&quot;,             2L,             2L,\n       4L, &quot;2004-10-10&quot;, &quot;2009-08-27&quot;,             1L,             1L,\n       5L, &quot;2000-12-05&quot;, &quot;2005-02-28&quot;,             2L,             1L,\n)\nfamily % mutate_at(vars(starts_with(\"dob\")), parse_date)<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 5 x 5\n#&gt;   family dob_child1 dob_child2 gender_child1 gender_child2\n#&gt;    &lt;int&gt; &lt;date&gt;     &lt;date&gt;             &lt;int&gt;         &lt;int&gt;\n#&gt; 1      1 1998-11-26 2000-01-29             1             2\n#&gt; 2      2 1996-06-22 NA                     2            NA\n#&gt; 3      3 2002-07-11 2004-04-05             2             2\n#&gt; 4      4 2004-10-10 2009-08-27             1             1\n#&gt; 5      5 2000-12-05 2005-02-28             2             1<\/code><\/pre>\n<p><\/p>\n<p>O data frame criado em cada linha cont\u00e9m informa\u00e7\u00f5es sobre as crian\u00e7as de uma fam\u00edlia. Nas fam\u00edlias pode haver uma ou duas crian\u00e7as. Para cada crian\u00e7a, s\u00e3o fornecidas informa\u00e7\u00f5es sobre a data de nascimento e o sexo, sendo que os dados para cada crian\u00e7a est\u00e3o em colunas separadas; nossa tarefa \u00e9 trazer esses dados para o formato correto para an\u00e1lise.<\/p>\n<p><\/p>\n<p>Observe que temos duas vari\u00e1veis com informa\u00e7\u00f5es sobre cada crian\u00e7a: seu sexo e sua data de nascimento (as colunas com o prefixo <em>dob<\/em> cont\u00eam a data de nascimento, enquanto as colunas com o prefixo <em>gender<\/em> cont\u00eam o sexo da crian\u00e7a). No resultado esperado, elas devem estar em colunas separadas. Podemos fazer isso gerando uma especifica\u00e7\u00e3o, na qual a coluna <code>.value<\/code> ter\u00e1 dois valores diferentes.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec %\n  pivot_longer_spec(-family) %&gt;%\n  separate(col = name, into = c(\".value\", \"child\"))%&gt;%\n  mutate(child = parse_number(child))\n<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 4 x 3\n#&gt;   .name         .value child\n#&gt;   &lt;chr&gt;         &lt;chr&gt;  &lt;dbl&gt;\n#&gt; 1 dob_child1    dob        1\n#&gt; 2 dob_child2    dob        2\n#&gt; 3 gender_child1 gender     1\n#&gt; 4 gender_child2 gender     2<\/code><\/pre>\n<p><\/p>\n<p>Portanto, vamos analisar passo a passo as a\u00e7\u00f5es realizadas pelo c\u00f3digo acima.<\/p>\n<p><\/p>\n<ul>\n<li><code>pivot_longer_spec(-family)<\/code> \u2014 estamos criando uma especifica\u00e7\u00e3o que comprime todas as colunas existentes, exceto a coluna family.<\/li>\n<li><code>separate(col = name, into = c(\".value\", \"child\"))<\/code> \u2014 separamos a coluna <em>.name<\/em>, que cont\u00e9m os nomes dos campos originais, por meio de um sublinhado e colocamos os valores obtidos nas colunas <em>.value<\/em> e <em>child<\/em>.<\/li>\n<li><code>mutate(child = parse_number(child))<\/code> \u2014 transformamos os valores do campo <em>child<\/em> de tipo de texto para tipo de dado num\u00e9rico.<\/li>\n<\/ul>\n<p><\/p>\n<p>Agora podemos aplicar a especifica\u00e7\u00e3o obtida ao data frame original e formatar a tabela da maneira desejada.<\/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 o argumento <code>na.rm = TRUE<\/code>, porque a forma atual dos dados for\u00e7a a cria\u00e7\u00e3o de linhas extras para observa\u00e7\u00f5es inexistentes. Como a fam\u00edlia 2 tem apenas uma crian\u00e7a, <code>na.rm = TRUE<\/code> garante que a fam\u00edlia 2 ter\u00e1 uma linha na sa\u00edda.<\/p>\n<p><\/p>\n<h2 id=\"preobrazovanie-data-freymov-iz-dlinnogo-formata-k-shirokomu\">Transforma\u00e7\u00e3o de data frames do formato longo para o largo<\/h2>\n<p><\/p>\n<p><code>pivot_wider()<\/code> \u00e9 a transforma\u00e7\u00e3o inversa, e por sua vez aumenta o n\u00famero de colunas do dataframe diminuindo o n\u00famero de linhas.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"O pacote tidyr e suas novas fun\u00e7\u00f5es pivot_longer e pivot_wider\" src=\"\/wp-content\/uploads\/2020\/04\/b470664e06f362d6f0ea6df9c1ed426d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Esse tipo de transforma\u00e7\u00e3o raramente \u00e9 usado para formatar dados de maneira organizada, no entanto, essa t\u00e9cnica pode ser \u00fatil para criar tabelas resumo utilizadas em apresenta\u00e7\u00f5es, ou para integra\u00e7\u00e3o com outras ferramentas.<\/p>\n<p><\/p>\n<p>Na verdade, as fun\u00e7\u00f5es <code>pivot_longer()<\/code> e <code>pivot_wider()<\/code> s\u00e3o sim\u00e9tricas e realizam a\u00e7\u00f5es opostas umas \u00e0s outras, ou seja: <code>df %&gt;% pivot_longer(spec = spec) %&gt;% pivot_wider(spec = spec)<\/code> e <code>df %&gt;% pivot_wider(spec = spec) %&gt;% pivot_longer(spec = spec)<\/code> retornar\u00e1 o df original.<\/p>\n<p><\/p>\n<h3 id=\"prosteyshiy-primer-privedeniya-tablicy-k-shirokomu-formatu\">Um exemplo b\u00e1sico de como deixar uma tabela em formato largo<\/h3>\n<p><\/p>\n<p>Para demonstrar o funcionamento da fun\u00e7\u00e3o <code>pivot_wider()<\/code> vamos usar o conjunto de dados <em>fish_encounters<\/em>, que cont\u00e9m informa\u00e7\u00f5es sobre como diferentes esta\u00e7\u00f5es registram o movimento dos peixes no rio.<\/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>Na maioria dos casos, essa tabela ser\u00e1 mais informativa e f\u00e1cil de usar se as informa\u00e7\u00f5es de cada esta\u00e7\u00e3o forem dispostas em colunas separadas.<\/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;           \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 com mais 9 linhas e 1 vari\u00e1vel a mais: MAW<\/code><\/pre>\n<p><\/p>\n<p>Esse conjunto de dados registra informa\u00e7\u00f5es apenas quando o peixe foi detectado por uma esta\u00e7\u00e3o, ou seja, se algum peixe n\u00e3o foi registrado por alguma esta\u00e7\u00e3o, ent\u00e3o esses dados n\u00e3o estar\u00e3o na tabela. Isso significa que a sa\u00edda estar\u00e1 preenchida com NA. <\/p>\n<p><\/p>\n<p>No entanto, neste caso sabemos que a aus\u00eancia de registro significa que o peixe n\u00e3o foi observado, portanto, podemos usar o argumento <em>values_fill<\/em> na fun\u00e7\u00e3o <code>pivot_wider()<\/code> e preencher esses valores ausentes com zeros:<\/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\">Gera\u00e7\u00e3o do nome da coluna a partir de v\u00e1rias vari\u00e1veis de origem<\/h3>\n<p><\/p>\n<p>Imagine que temos uma tabela contendo combina\u00e7\u00f5es de produto, pa\u00eds e ano. Para gerar um dataframe de teste, voc\u00ea pode executar o seguinte c\u00f3digo:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">df %\n  filter((product == \"A\" &amp; country == \"AI\") | product == \"B\") %&gt;% \n  mutate(value = rnorm(nrow(.)))<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 45 x 4\n#&gt;    product country  year    value\n#&gt;    &lt;chr&gt;   &lt;chr&gt;   &lt;int&gt;    &lt;dbl&gt;\n#&gt;  1 A       AI       2000 -2.05   \n#&gt;  2 A       AI       2001 -0.676  \n#&gt;  3 A       AI       2002  1.60   \n#&gt;  4 A       AI       2003 -0.353  \n#&gt;  5 A       AI       2004 -0.00530\n#&gt;  6 A       AI       2005  0.442  \n#&gt;  7 A       AI       2006 -0.610  \n#&gt;  8 A       AI       2007 -2.77   \n#&gt;  9 A       AI       2008  0.899  \n#&gt; 10 A       AI       2009 -0.106  \n#&gt; # \u2026 with 35 more rows<\/code><\/pre>\n<p><\/p>\n<p>Nossa tarefa \u00e9 expandir o dataframe de modo que uma coluna contenha dados para cada combina\u00e7\u00e3o de produto e pa\u00eds. Para isso, basta passar para o argumento <em>names_from<\/em> um vetor contendo os nomes dos campos a serem combinados.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">df %&gt;% pivot_wider(names_from = c(product, country),\n                 values_from = \"value\")<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 15 x 4\n#&gt;     year     A_AI    B_AI    B_EI\n#&gt;    &lt;int&gt;    &lt;dbl&gt;   &lt;dbl&gt;   &lt;dbl&gt;\n#&gt;  1  2000 -2.05     0.607   1.20  \n#&gt;  2  2001 -0.676    1.65   -0.114 \n#&gt;  3  2002  1.60    -0.0245  0.501 \n#&gt;  4  2003 -0.353    1.30   -0.459 \n#&gt;  5  2004 -0.00530  0.921  -0.0589\n#&gt;  6  2005  0.442   -1.55    0.594 \n#&gt;  7  2006 -0.610    0.380  -1.28  \n#&gt;  8  2007 -2.77     0.830   0.637 \n#&gt;  9  2008  0.899    0.0175 -1.30  \n#&gt; 10  2009 -0.106   -0.195   1.03  \n#&gt; # \u2026 with 5 more rows<\/code><\/pre>\n<p><\/p>\n<p>Voc\u00ea tamb\u00e9m pode aplicar especifica\u00e7\u00f5es \u00e0 fun\u00e7\u00e3o <code>pivot_wider()<\/code>. Mas ao passar para <code>pivot_wider()<\/code> a especifica\u00e7\u00e3o realiza uma transforma\u00e7\u00e3o oposta <code>pivot_longer()<\/code>: colunas s\u00e3o criadas conforme especificado em <em>.name<\/em>, utilizando valores de <em>.value<\/em> e outras colunas.<\/p>\n<p><\/p>\n<p>Para este conjunto de dados, voc\u00ea pode gerar uma especifica\u00e7\u00e3o personalizada se desejar que cada combina\u00e7\u00e3o poss\u00edvel de pa\u00eds e produto tenha sua pr\u00f3pria coluna, em vez de apenas aquelas que est\u00e3o presentes nos dados:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec % \n  expand(product, country, .value = \"value\") %&gt;% \n  unite(\".name\", product, country, remove = FALSE)<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 4 x 4\n#&gt;   .name product country .value\n#&gt;   &lt;chr&gt; &lt;chr&gt;   &lt;chr&gt;   &lt;chr&gt; \n#&gt; 1 A_AI  A       AI      value \n#&gt; 2 A_EI  A       EI      value \n#&gt; 3 B_AI  B       AI      value \n#&gt; 4 B_EI  B       EI      value<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">df %&gt;% pivot_wider(spec = spec) %&gt;% head()<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 6 x 5\n#&gt;    year     A_AI  A_EI    B_AI    B_EI\n#&gt;   &lt;int&gt;    &lt;dbl&gt; &lt;dbl&gt;   &lt;dbl&gt;   &lt;dbl&gt;\n#&gt; 1  2000 -2.05       NA  0.607   1.20  \n#&gt; 2  2001 -0.676      NA  1.65   -0.114 \n#&gt; 3  2002  1.60       NA -0.0245  0.501 \n#&gt; 4  2003 -0.353      NA  1.30   -0.459 \n#&gt; 5  2004 -0.00530    NA  0.921  -0.0589\n#&gt; 6  2005  0.442      NA -1.55    0.594<\/code><\/pre>\n<p><\/p>\n<h2 id=\"neskolko-prodvinutyh-primerov-raboty-s-novoy-koncepciey-tidyr\">V\u00e1rios exemplos avan\u00e7ados de trabalho com o novo conceito do 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\">Organizando dados com o exemplo do conjunto de dados sobre a renda e aluguel nos EUA<\/h3>\n<p><\/p>\n<p>Conjunto de dados <em>us_rent_income<\/em> cont\u00e9m informa\u00e7\u00f5es sobre a renda m\u00e9dia e o aluguel para cada estado nos EUA em 2017 (o conjunto de dados est\u00e1 dispon\u00edvel no pacote <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 com mais 94 linhas<\/code><\/pre>\n<p><\/p>\n<p>Na forma em que os dados est\u00e3o armazenados no conjunto de dados <em>us_rent_income<\/em> \u00e9 muito inconveniente trabalhar com eles, ent\u00e3o gostar\u00edamos de criar um conjunto de dados com as colunas: <em>rent<\/em>, <em>rent_moe<\/em>, <em>come<\/em>, <em>income_moe<\/em>. Existem v\u00e1rias maneiras de criar essa especifica\u00e7\u00e3o, mas o importante \u00e9 que precisamos gerar cada combina\u00e7\u00e3o de valores da vari\u00e1vel e <em>estimate\/moe<\/em>, e ent\u00e3o gerar o nome da coluna.<\/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>Fornecer essa especifica\u00e7\u00e3o <code>pivot_wider()<\/code> nos d\u00e1 o resultado que estamos procurando:<\/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>\u00c0s vezes, trazer um conjunto de dados para o formato adequado requer v\u00e1rias etapas.<br \/>\nConjunto de dados <em>world_bank_pop<\/em> cont\u00e9m dados do Banco Mundial sobre a popula\u00e7\u00e3o de cada pa\u00eds no per\u00edodo de 2000 a 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>Nosso objetivo \u00e9 criar um conjunto de dados organizado, onde cada vari\u00e1vel esteja em uma coluna separada. Ainda n\u00e3o est\u00e1 claro quais etapas s\u00e3o necess\u00e1rias, mas vamos come\u00e7ar com o problema mais \u00f3bvio: o ano est\u00e1 distribu\u00eddo em v\u00e1rias colunas.<\/p>\n<p><\/p>\n<p>Para corrigir isso, \u00e9 necess\u00e1rio usar a fun\u00e7\u00e3o <code>pivot_longer()<\/code>.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">pop2 % \n  pivot_longer(`2000`:`2017`, names_to = \"year\")<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 19,008 x 4\n#&gt;    country indicator   year  value\n#&gt;    &lt;chr&gt;   &lt;chr&gt;       &lt;chr&gt; &lt;dbl&gt;\n#&gt;  1 ABW     SP.URB.TOTL 2000  42444\n#&gt;  2 ABW     SP.URB.TOTL 2001  43048\n#&gt;  3 ABW     SP.URB.TOTL 2002  43670\n#&gt;  4 ABW     SP.URB.TOTL 2003  44246\n#&gt;  5 ABW     SP.URB.TOTL 2004  44669\n#&gt;  6 ABW     SP.URB.TOTL 2005  44889\n#&gt;  7 ABW     SP.URB.TOTL 2006  44881\n#&gt;  8 ABW     SP.URB.TOTL 2007  44686\n#&gt;  9 ABW     SP.URB.TOTL 2008  44375\n#&gt; 10 ABW     SP.URB.TOTL 2009  44052\n#&gt; # \u2026 with 18,998 more rows<\/code><\/pre>\n<p><\/p>\n<p>O pr\u00f3ximo passo \u00e9 considerar a vari\u00e1vel indicator.<br \/>\n<code>pop2 %&gt;% count(indicator)<\/code><\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 4 x 2\n#&gt;   indicator       n\n#&gt;   &lt;chr&gt;       &lt;int&gt;\n#&gt; 1 SP.POP.GROW  4752\n#&gt; 2 SP.POP.TOTL  4752\n#&gt; 3 SP.URB.GROW  4752\n#&gt; 4 SP.URB.TOTL  4752<\/code><\/pre>\n<p><\/p>\n<p>Onde SP.POP.GROW \u00e9 o crescimento populacional, SP.POP.TOTL \u00e9 a popula\u00e7\u00e3o total, e SP.URB. * \u00e9 o mesmo, mas apenas para \u00e1reas urbanas. Vamos dividir esses valores em duas vari\u00e1veis: area \u2014 local (total ou urbano) e uma vari\u00e1vel contendo os dados reais (population ou growth):<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">pop3 % \n  separate(indicator, c(NA, \"area\", \"variable\"))<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 19,008 x 5\n#&gt;    country area  variable year  value\n#&gt;    &lt;chr&gt;   &lt;chr&gt; &lt;chr&gt;    &lt;chr&gt; &lt;dbl&gt;\n#&gt;  1 ABW     URB   TOTL     2000  42444\n#&gt;  2 ABW     URB   TOTL     2001  43048\n#&gt;  3 ABW     URB   TOTL     2002  43670\n#&gt;  4 ABW     URB   TOTL     2003  44246\n#&gt;  5 ABW     URB   TOTL     2004  44669\n#&gt;  6 ABW     URB   TOTL     2005  44889\n#&gt;  7 ABW     URB   TOTL     2006  44881\n#&gt;  8 ABW     URB   TOTL     2007  44686\n#&gt;  9 ABW     URB   TOTL     2008  44375\n#&gt; 10 ABW     URB   TOTL     2009  44052\n#&gt; # \u2026 with 18,998 more rows<\/code><\/pre>\n<p><\/p>\n<p>Agora s\u00f3 precisamos dividir a vari\u00e1vel variable em duas colunas:<\/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 contatos<\/h3>\n<p><\/p>\n<p>Por \u00faltimo, imagine que voc\u00ea tem uma lista de contatos que copiou e colou de um site:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">contacts &lt;- tribble(\n  ~field, ~value,\n  &quot;name&quot;, &quot;Jiena McLellan&quot;,\n  &quot;company&quot;, &quot;Toyota&quot;, \n  &quot;name&quot;, &quot;John Smith&quot;, \n  &quot;company&quot;, &quot;google&quot;, \n  &quot;email&quot;, &quot;john@google.com&quot;,\n  &quot;name&quot;, &quot;Huxley Ratcliffe&quot;\n)<\/code><\/pre>\n<p><\/p>\n<p>Transformar essa lista em uma tabela \u00e9 bastante complicado, pois n\u00e3o h\u00e1 uma vari\u00e1vel que identifique quais dados pertencem a qual contato. Podemos corrigir isso, observando que os dados para cada novo contato come\u00e7am com o nome (\"name\"), portanto, podemos criar um identificador exclusivo e aument\u00e1-lo em um para cada vez que o valor \"name\" aparece na coluna field.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">contacts % \n  mutate(\n    person_id = cumsum(field == \"name\")\n  )\ncontacts<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">#&gt; # A tibble: 6 x 3\n#&gt;   field   value            person_id\n#&gt;   &lt;chr&gt;   &lt;chr&gt;                &lt;int&gt;\n#&gt; 1 name    Jiena McLellan           1\n#&gt; 2 company Toyota                   1\n#&gt; 3 name    John Smith               2\n#&gt; 4 company google                   2\n#&gt; 5 email   john@google.com          2\n#&gt; 6 name    Huxley Ratcliffe         3<\/code><\/pre>\n<p><\/p>\n<p>Agora que temos um identificador \u00fanico para cada contato, podemos girar o campo e o valor em colunas:<\/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\">Conclus\u00e3o<\/h2>\n<p><\/p>\n<p>Pessoalmente, acredito que a nova concep\u00e7\u00e3o <strong>tidyr<\/strong> \u00e9 realmente mais intuitiva e supera significativamente as fun\u00e7\u00f5es obsoletas. <code>spread()<\/code> e <code>gather()<\/code>Espero que este artigo tenha ajudado voc\u00ea a entender melhor <code>pivot_longer()<\/code> e <code>pivot_wider()<\/code>.<\/p>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/444622\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0430\u043a\u0435\u0442 tidyr \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u044f\u0434\u0440\u043e \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 R \u2014 tidyverse. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 \u2014 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e\u043c\u0443 \u0432\u0438\u0434\u0443. \u041d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0451\u043d\u043d\u0430\u044f \u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u043f\u0430\u043a\u0435\u0442\u0443, \u043d\u043e \u0434\u0430\u0442\u0438\u0440\u0443\u044e\u0435\u0442\u0441\u044f \u043e\u043d\u0430 2015 \u0433\u043e\u0434\u043e\u043c. \u0410 \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043e \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0445, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043d\u0435\u0439 \u043d\u0430\u0437\u0430\u0434 \u0441\u043e\u043e\u0431\u0449\u0438\u043b \u0435\u0433\u043e \u0430\u0432\u0442\u043e\u0440 \u0425\u0435\u0434\u043b\u0438 \u0412\u0438\u043a\u0445\u0435\u043c. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":76292,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-76291","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0430\u043a\u0435\u0442 tidyr \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u044f\u0434\u0440\u043e \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 R \u2014 tidyverse. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 \u2014 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e\u043c\u0443 \u0432\u0438\u0434\u0443. \u041d\u0430 \u0425\u0430\u0431\u0440\u0435.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/r-paket-tidyr-i-ego-novye-funkczii-pivot_longer-i-pivot_wider\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\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\/pt\/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\udd47Pacote R tidyr e suas novas fun\u00e7\u00f5es pivot_longer e pivot_wider | ProHoster","description":"O pacote tidyr faz parte do n\u00facleo de uma das bibliotecas mais populares na linguagem R \u2014 tidyverse. A principal fun\u00e7\u00e3o do pacote \u00e9 a organiza\u00e7\u00e3o dos dados de forma adequada. No Habr.","canonical_url":"https:\/\/prohoster.info\/pt\/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":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/76291","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=76291"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/76291\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/76292"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=76291"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=76291"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=76291"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}