• Fernanda Kelly

Pacote: Tidyr

Todas as pessoas inseridas no universo de dados uma hora outra lê, ouve ou diz algo sobre "dados organizados", mas o que são esses dados ditos organizados? Dados organizados são aqueles em que cada coluna é uma variável, cada linha é uma observação e cada célula da planilha ou outra forma de armazenamento de dados é um único valor. No mundo da computação, muitos se referem a essa estrutura tipicamente por dados estruturados.

E qual é a forma destes dados visualmente?



Visualmente eles se assemelham de acordo com a imagem ao lado e, com toda certeza, você em algum momento trabalhou com este tipo de dados, só não sabia sua nomenclatura.


Entretanto, a realidade dos dados reais não é essa. Normalmente eles chegam até nós extremamente "bagunçados" e é aí que se inicia uma das etapas de Transform da ETL (Extract, Transform and Load) da vida dos analistas/cientistas de dados.


E qual ferramenta/pacote utilizar?

Existem algumas formas de se tratar dados estruturados, mas na linguagem R temos um pacote extraordinário para este tipo de tarefa e ele se chama: Tidyr. Os dados do Tidy descrevem uma maneira padrão de armazenar dados que é usada sempre que possível em todo o conjunto de ferramentas do Tidyverse e, por isso, se você garantir que seus dados estejam organizados, você gastará menos tempo lutando com as ferramentas e mais tempo trabalhando em sua análise. É válido ressaltar que o pacote protagonista deste resumo tem como autores o estatístico Hadley Wickham e o Lionel Henry.


O pacote tidyr contém ferramentas para alterar a forma (dinamização) e hierarquia (aninhamento e 'desaninhamento') de um conjunto de dados, transformando listas profundamente aninhadas em quadros de dados retangulares e extraindo valores de colunas de string, ou seja, para você organizar dados em formato inadequado, primeiro você identifica as variáveis ​​em seu conjunto de dados e, em seguida, usa as ferramentas fornecidas pelo tidyr para movê-las em colunas.


O tidyr fornece três funções principais para alterar o layout dos valores em uma tabela, são elas:

  • gather(): move colunas em linhas

  • separate(): divide uma única variável em duas

  • spread(): move linhas em colunas

A função gather() é mais conhecida por tornar dados ditos largos em longos. O que isso quer dizer? Para uma uma melhor visualização atente-se a imagem abaixo.

Diante do formato já é possível entender o porque do largo para longo, respectivamente a imagem. As colunas 1999 e 2000 tornaram-se linhas da coluna year e os respectivos valores das colunas 1999 e 2000 permanecem em linha, porém passam a pertencer a coluna cases. Note que no formato largo tínhamos 3 colunas e 3 linhas e no formato longo passamos a ter 6 linhas e 3 colunas.


E como fazer isso no R?

Vamos construir o data frame e instalar/carregar os pacotes? Copia e cola em seu source e vamos juntes nesse exemplo.


needs::needs(tidyverse, tidyr)
world <- data.frame(
  country = c("A","B", "C"),
  "1999" = c("0.7k","37k","212k"),
  "2000" = c("2k","80k","213k")
)

A função gather() possui 6 parâmetros e inicialmente vamos entender como cada parâmetro funciona. Eles são:

  • data: o conjunto de dados a ser modificado (no nosso caso o data frame world);

  • key: o nome da nova variável de “nomenclatura” (year);

  • value: o nome da nova variável de “resultado” (cases);

  • na.rm: se TRUE, removerá as linhas da saída onde a coluna de valor é NA (em nosso data frame este caso não se aplica);

  • convert: converte qualquer coisa que parece que deveria estar em outro formato para esse outro formato de interesse, por exemplo, numérico para numérico;

  • factor_key: se FALSE (default), o value e a key serão armazenados como um vetor de caracteres. Se TRUE, estes serão armazenados como um fator, que preserva a ordem original das colunas.

Então, para aplicar a função em nossos dados façamos:


exemplo1 <- tidyr::gather(data = world, key = year, value = cases, 1999:2000)
head(exemplo1)

Assim que você executar o código acima, aparecerá em seu console o formato longo igualmente a imagem de visualização da função gather().


Já a função spread() executa exatamente o contrário. Ele torna dados ditos longos em largos e na imagem abaixo é possível verificar essa estrutura.

Neste exemplo a coluna type se encontra particionada duas categorias, cases e pop. E qual é a a aplicação desta função neste exemplo? A intenção é tornar as linhas da coluna type em duas colunas no data frame. Essa demanda pode ocorrer quando o interesse de pesquisa/análise é investigar essas duas categorias, porém no data frame elas se encontram na mesma coluna.


O formato dessa função é semelhante ao da função gather(). Ela possui 7 parâmetros, sendo eles:

  • data: os dados a serem reformatados (earth);

  • key: a coluna que você deseja separar ( type);

  • value: a coluna que você deseja usar para preencher as novas colunas (a value coluna que acabamos de criar na etapa de distribuição);

  • fill: o que substituir se houver combinações que não existem (não é o caso do nosso exemplo);

  • convert: se deve corrigir tipos de dados incorretos a medida que avança;

  • drop: se FALSE, manterá os níveis dos fatores que não aparecem nos dados, preenchendo as combinações ausentes com preenchimento;

  • sep: se for NULL, os nomes das colunas serão retirados dos valores da variável chave. Se não for NULL, os nomes das colunas serão fornecidos por "<key_name> <sep> <key_value>".

Para exemplificar podemos utilizar o data frame do exemplo 1 e o earth abaixo. Copia e cola em seu source para melhor entendimento.


earth <- data.frame(
  country = c("A", "A", "A","A","B","B","B","B", "C","C","C","C"),
  "year" = c(1999,1999,2000,2000,1999,1999,
             2000,2000,1999,1999,2000,2000),
  "type"= c("cases", "pop","cases", "pop","cases", "pop","cases", 
            "pop","cases", "pop","cases", "pop"),
  "count" = c("0.7k","19k","2k", "20M", "37K", "172M", "80K", 
              "174M", "212K", "1T","213K", "1T")
)

Aplicando a função spread no exemplo 1,


exemplo2 <- tidyr::spread(data = exemplo1, key = year, value = cases)
head(exemplo2)

você verá que ele retornará a sua estrutura inicial, em que os anos de 1999 e 2000 são colunas. No data frame earth, façamos:


exemplo3 <- tidyr::spread(data = earth, key = type, value = count)
head(exemplo3)

Pronto! Em seu console você verá que chegamos ao resultado idêntico ao da imagem utilizada para exemplificar a função spread(). Sensacional né? Tem mais (rsrs).


Temos a função separate() que é utilizada para dividir ou combinar células em formato individual. Em muitos casos recebemos colunas como a rate da imagem abaixo, que são colunas que recebem duas informações e são separadas por hífen (-), ponto e vírgula (;) , underline (_) e vários outros caracteres especiais. É válido ressaltar que a função contrária a separate() é a função unite().



Essa função possui 8 parâmetros, são eles:

  • data: data frame;

  • col: nome da coluna que representa a variável atual;

  • into: nome das variáveis que representaram novas variáveis;

  • sep: como separar a variável atual (char, num ou símbolo);

  • remove: se TRUE, remove a coluna de entrada do quadro de dados de saída;

  • convert: se TRUE, irá converter automaticamente os valores em lógico, inteiro, numérico, complexo ou fator conforme apropriado.

Para exemplificação dessa função utilizaremos o data frame moon. Copie e cole em seu source e vamos juntes.


moon <- data.frame(
  country = c("A","A","B","B", "C","C"),
  "year" = c(1999,2000,1999,2000,1999,2000),
  "rate" = c("0.7k/19M","2k/20M","37k/172M", 
             "80K/174M", "212K/1T","213K/1T")
)

Como mencionei no início deste resumo, o pacote tidyr faz parte do tidyverse, ou seja, a função pipe pode ser utilizada juntamente com as função gather(), spread() e separate(). Veja que o resultado do código abaixo é idêntico a imagem de exemplificação dessa função. Demais né?


moon %>% 
  tidyr::separate(col = rate, sep = "/", into = c("cases", "pop"))

Diferente das função gather() e spread(), a função separate() possui mais uma variação. Essa variação é a função separate_rows(). O nome já é bem sugestivo, mas esta função separa cada célula em uma coluna para fazer várias linhas. A exemplificação dessa função ficará de exercício e, se você fizer, compartilha aqui nos comentários.


Outra notícia sensacional é que o tidyr também inclui ferramentas para trabalhar com valores ausentes (implícitos e explícitos).


Como isso funciona?

Há três funções com esta funcionalidade no pacote tidyr, são elas:

  • drop_na(): exclui as linhas que possui NA na coluna de escolha;

  • fill(): preenche as células que se encontram preenchidas por NA com valores não NA mais recentes da coluna;

  • replace_na(): substitui os NA por valores de escolha.



É importante mencionar que o pacote tidyr se encontra na versão 1.1.2 e, consequentemente, alterações foram feitas. Algumas delas foram inserções de novas funcionalidades ao pacote com o objetivo de melhorar a usabilidade do gather() e spread(). Essas novas função são pivot_longer() e pivot_wider().


Existem dois novos recursos importantes inspirados por outros pacotes R que estão avançando na remodelação em R:

  • pivot_longer() pode trabalhar com várias variáveis ​​de valor que podem ter tipos diferentes, inspirado nas funções aprimoradas melt() e dcast()fornecidas pelo pacote data.table de Matt Dowle e Arun Srinivasan.

  • pivot_longer() e pivot_wider() pode pegar um quadro de dados que especifica precisamente como os metadados armazenados nos nomes das colunas se tornam variáveis ​​de dados (e vice-versa), inspirado no pacote cdata de John Mount e Nina Zumel.


Onde você pode aprender essas novas funcionalidades?

Você pode dar uma olhada em um dos artigos da curso-r que foi escrito pela querida Nicole Luduvice e nos artigos do pacote tidyr. Vale a pena dar essa espiada nesses materiais.


Fiquem bem e bons estudos :))

Posts recentes

Ver tudo