Manipulação de dados
Introdução
Nas aulas anteriores, trabalhamos com dois pacotes do tidyverse: readr e readxl. Com eles, aprendemos a importar dados de arquivos .csv e planilhas do Excel para dentro do R. Também vimos que esses dados são armazenados, em geral, no formato de tibbles, que são uma versão moderna dos data frames tradicionais do R.
Até aqui, nosso foco foi trazer os dados para o ambiente de trabalho e entender sua estrutura. Mas importar dados é apenas o primeiro passo. Na prática, quase nunca utilizamos um conjunto de dados exatamente da forma como ele chega até nós. É comum precisarmos selecionar colunas específicas, filtrar observações, criar novas variáveis ou calcular estatísticas. Para isso, utilizaremos o pacote dplyr, também da coleção tidyverse. Ele foi desenvolvido para facilitar a manipulação de dados tabulares.
Importando dados
Nesta aula, vamos trabalhar com um compilado global de dados de química mineral de clinopiroxênios do manto (Qin et al. 2022). Esses dados estão disponíveis no banco de dados GEOROC (Lehnert et al. 2000) e podem ser baixados através deste link.
A planilha .xlsx possui três abas, e as três primeiras linhas de cada aba servem como cabeçalho. Desse modo, para importar os dados de elementos maiores adequadamente, devemos executar o seguinte código:
Vamos carregar também o pacote dplyr, que vamos usar durante esta aula. Quando carregamos esse pacote, temos acesso à função glimpse(), que desempenha um papel semelhante ao da função str(), porém mais adequada para trabalhar com tibbles:
Verbos
As funções do dplyr são conhecidas como verbos porque representam ações sobre os dados. No geral, os verbos desse pacote seguem a seguinte lógica:
O primeiro argumento da função é sempre um conjunto de dados (um tibble ou data frame).
Os argumentos seguintes indicam o que queremos fazer com esse conjunto de dados.
A função retorna outro tibble como resultado.
O objeto original não é modificado automaticamente.
Select
Vamos entender essas etapas na prática usando o verbo select(), que seleciona colunas de uma tabela. Digamos que não estejamos interessados em todas as variáveis de cpx_majors, mas apenas no nome das amostras e dos valores dos óxidos. Podemos selecionar essas colunas dessa maneira:
Nosso objeto original continua intacto:
Pipe
Costuma-se usar o operador pipe (|>) com bastante frequência com os verbos do dplyr. Esse operador pega o objeto que está à sua esquerda e o usa como primeiro argumento da função que está à sua direita. Por exemplo:
O pipe é especialmente útil quando queremos aplicar mais de uma função em sequência (em cadeia):
Você também poderá encontrar o pipe representado pelo operador %>%. Esse operador foi criado como parte do pacote magrittr do tidyverse, antes do R incluir o pipe nativo (|>) a partir da versão 4.1.
Nesta disciplina, utilizaremos |>, mas é importante saber que %>% ainda é amplamente usado:
Filter
Agora que entendemos como a lógica geral dos verbos do pacote dplyr funciona, usando o exemplo do verbo select(), e entendemos como podemos encadeá-los como o operador pipe, vamos explorar outros verbos e ampliar as possibilidades de manipulação dos nossos dados.
Digamos que estamos interessados apenas nas análises de clinopiroxênio que foram feitas no núcleo. Podemos selecionar essas observações com o verbo filter():
Assim como fizemos na aula passada, também podemos combinar condições. Vamos selecionar todas as análises de núcleo que são provenientes de rochas de ambiente intraplaca:
Usando |>, podemos combinar filter() e select(). Por exemplo:
Mutate
O verbo mutate() nos permite criar novas colunas. Vamos usá-lo para criar uma nova coluna TOTAL(WT%) que corresponderá à soma dos elementos maiores.
Para calcular essa soma, precisamos operar linha por linha. Isso é feito com a função rowSums(), que faz parte do R base. Em conjunto, usamos a função pick() do pacote dplyr para indicar quais colunas devem ser consideradas no cálculo. Lembre-se de que você pode consultar a documentação dessas funções para saber mais.
Rename
Como vimos acima, nossa tabela tem nomes de colunas com espaços em branco e símbolos. Por causa disso, para acessá-las com o dplyr temos que escrevê-las dentro desses símbolos: ``.
Para facilitar as etapas seguintes, podemos renomear as colunas para algo que seja mais fácil de trabalhar com o R. Por exemplo, vamos renomear os óxidos e algumas outras colunas:
Perceba que assim como os outros verbos do dplyr, rename() não altera o objeto original a menos que salvemos o resultado.
Arrange
O verbo arrange() reordena a tabela de acordo com uma variável de sua escolha. No exemplo abaixo, selecionamos as amostras e os óxidos e reordenamos de acordo com a coluna SiO2:
Repare que por padrão esse verbo reordena a tabela em ordem crescente da variável escolhida. Para reordenar em ordem decrescente, podemos utilizar a função desc():
Summarize
O verbo summarize() é geralmente usado para obter informações estatísticas (por exemplo, média, mediana e desvio padrão) de uma coluna. O R base tem funções base para realizar esses cálculos: mean(), median() e sd(), respectivamente.
Vamos calcular a média da coluna SiO2:
Para calcular a média de todos os óxidos de uma só vez podemos usar a função select() em conjunto com summarize_all():
Uma outra maneira de conseguir o mesmo resultado sem utilizar select() e summarize_all() é usando across(). Essa função nos deixa escolher as colunas que queremos usar para aplicar uma determinada função, sem a necessidade de escolhê-las com antecedência:
Group by
Outro verbo bastante importante é group_by(). Ele divide a tabela em grupos com base em uma ou mais variáveis. Depois disso, verbos como summarize(), mutate() e filter() passam a agir dentro de cada grupo, não mais na tabela inteira.
O código abaixo mostra a mediana da cocentração (wt%) de SiO2 em clinopiroxênios para cada um dos ambientes tectônicos:
Se quisermos saber de que ambiente tectônico vem a maioria dos nossos dados, podemos executar o seguinte código:
n() é uma função que podemos usar dentro de summarize(), mutate() e filter().
Uma outra alternativa é usar a função count() com o nome da coluna que nos interessa:
Exercício
Para este exercício, use o objeto cpx_majors_renamed que nós criamos anteriormente.
- Nós já mudamos os nomes de algumas colunas, agora mude o nome das outras colunas usando
rename()para que não incluam espaços em branco e símbolos.
Você pode usar _ se necessário. Tente seguir o estilo que usamos anteriormente com Setting, Sample e Type.
- Atualize a coluna
Locationusando o verbomutate()para que o nome das localidades sejam apresentados em letra minúscula. Observação: você terá que usar uma função que foi ensinada na aula passada.
- Usando uma combinação de
filter()esummarize(), qual a mediana de SiO2 de piroxênios de borda (rim) de ambientes convergentes (convergent margin)?
- Em qual ambiente tectônico se encontra clinopiroxênios com maior concentração média de TiO2? Dica:
group_by()emean()são úteis para resolver essa questão. Se usarmean(), não esqueça de usar o argumentona.rmpara remover dados ausentes.
- Qual o tipo de rocha mais presente na nossa tabela? Use uma combinação de verbos para achar a resposta.
Considerações finais
Na aula de hoje aprendemos a manipular dados tabulares e vimos que a preparação dos dados é uma etapa essencial antes de qualquer análise. Trabalhamos diferentes formas de selecionar, transformar, resumir e organizar informações, entendendo como essas operações fazem parte do fluxo natural de trabalho com dados. Na próxima aula, começaremos a visualizar dados com o ggplot2, dando início a uma nova etapa do curso voltada à exploração e interpretação dos dados por meio de gráficos.