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 :))
Comments