Hackeando o R: o pacote {data.table}

O {data.table} é um pacote do R e também uma classe de objetos que pode ser considerado uma extensão do data.frame comum: possuem uma estrutura de colunas que dispõe do mesmo comprimento, e para cada coluna, uma classe única, e também diferentes tipos de observações em diferentes colunas. O objetivo do pacote é ter uma sintaxe simples para a análise de dados, e ser extremamente rápido em relação ao tempo de resposta do uso. Por isso, o ponto alto do pacote é que ele é extremamente útil para análise de grandes conjuntos de dados, principalmente microdados. No post de hoje, iremos introduzir o pacote {data.table} e mostrar como ele pode ser útil.

O {data.table} além de um pacote, é um tipo de classe que funciona no que pode se chamar de "3d": linhas, colunas e grupos.

DT[i, j, by ] + argumentos adicionais

O primeiro argumento "i", serve com controle das linhas do data.table, filtrando expressões ou números de acordo com as colunas selecionadas.

O argumento, "j" é utilzado para controlar colunas, sendo possivel selecionar, calcular e realizar diversas outras mudanças.

"by" realiza as operações de colunas por grupos, para comparação, tem o efeito parecido com a função group_by do pacote {dplyr}, porém com mais possbilidade de transformações e sinergia com os argumentos anteriores.

Na prática, a forma de escrita dos argumentos do {data.table} lê-se como: Pegue os dados, filtre as linhas por "i", e então calcule "j" por "by'. Iremos demonstrar alguns exemplos com pontos introdutórios importantes do pacote.

library(data.table)

Criar um objeto data.table funciona da mesma forma que criar um objeto data.frame comum. Utilizamos a função data.table para criar as linhas conforme os nomes das colunas. No exemplo abaixo, criamos um data.table com três colunas: uma do tipo numérico, a segunda do tipo caracter, e a terceira do tipo lógico.

 

data.table::data.table(a = 1:5,
name = c("a", "b", "c", "d", "e"),
logical = c(TRUE, FALSE, TRUE, FALSE, FALSE))

Para transformar um objeto data.frame (ou outra classe) para data.table, utiliza-se a função as.data.table. No exemplo abaixo vemos qual o efeito sobre o data.frame "iris".

as.data.table(iris)

 

Repare na forma que é apresentado um conjunto de dados da classe data.table no console. É criado um índice numerando a quantidade de linhas, a partir da primeira observação, e que se separa visualmente das colunas por dois pontos. Outro ponto é que mostrado as primeiras e últimas 5 linhas do data.table.

A importação de dados pelo data.table é feita a partir da função fread. Além de ser extremamente rápida na leitura de dados, se comparada com outras funções, fread realiza a leitura de forma inteligente, não necessitando na maioria das vezes criar argumentos ou utilizar de outras funções para ler corretamente os dados.

iris_table <- fread("https://forge.scilab.org/index.php/p/rdataset/source/file/master/csv/datasets/iris.csv")

 

O objeto importado pela função fread é automaticamente criado em classe data.table.

class(iris_table)

 

Com o básico em mãos, podemos adentrar nos conceitos básicos dos argumentos do pacote.

Filtrar

O filtro de observações deve ser sempre utilizado como primeiro argumento no data.table. Veja que para utilizar a função deve-se escrever o nome do objeto e em seguida abrir colchetes.

</pre>
# Filtra valores de Sepal.Length maiores que 7

iris_table[Sepal.Length > 7]

# Filtra valores de Sepal.Length maiores que 7 e Sepal.Width maiores que 3

iris_table[Sepal.Length > 7 & Sepal.Width > 3]

# Filtra valores de Species para apenas virginica

iris_table[Species == "virginica"]
<pre>

Colunas

O argumento de manipulação de colunas deve sempre ser o segundo argumento dentro dos colchetes, é separado por uma virgula do primeiro argumento, mesmo que este não seja utilizado.

</pre>
# Retirar a primeira coluna do data.table

iris_table <- iris_table[, -"V1"]
<pre>

Um ponto importante a comentar é que a seleção de colunas pode ser feita de diferentes formas. É possível selecionar pelo número da ordem da coluna ou pelo nome. Pelo nome da coluna, caso não esteja entre aspas, é retornado um vetor, ao invés de objeto data.table. Outro forma de selecionar é através de um parênteses em conjunto de um ponto, essa forma torna mais simples os cálculos da colunas.

</pre>
# Seleciona a primeira coluna

iris_table[, 1]

# Seleciona apenas a colunas Sepal.Lenth

iris_table[, Sepal.Length] # Retorna vetor

iris_table[, "Sepal.Length"]

iris_table[, .(Sepal.Length)]
<pre>

Vemos também a utilização dos argumentos "i" e "j" juntos. Também realizamos calculos das colunas utilizando funções base do R.

</pre>
# Filtra valores de Sepal.Length maiores que 7 e seleciona apenas a coluna Sepal.Length

iris_table[Sepal.Length > 7, "Sepal.Length"]

# Calcula a média da coluna Sepal.Length

iris_table[, mean(Sepal.Length)] # retorna um vetor

iris_table[, .(mean(Sepal.Length))] # retorna um data.table

# Filtra valores de Sepal.width maiores que 3,2 e calcula os desvio padrão da coluna

iris_table[Sepal.Width > 3.2, sd(Petal.Width)]
<pre>

Grupos

Os grupos surgem como o último argumento dos colchetes, sendo necessário a utilização dos outros dois argumentos. O propósito do "by" é junta as categorias de uma coluna e possibilitar o cálculo por grupos.

</pre>
# Calcula a média de Sepal.Length por espécie

iris_table[, mean(Sepal.Length), by = "Species"]

# Calcula a média de Sepal.Length por espécie nomeando a nova coluna de "mean"

iris_table[, .(mean = mean(Sepal.Length)), by = (Species)]
<pre>

O data.table permite que seja feito um encadeamento de colchetes, possibilitando que seja feito manipulações por etapas.


iris_table[, .(Sepal.Length, Species, Petal.Length)][Sepal.Length > 6.5][, .(mean_sepal = mean(Sepal.Length),
mean_petal = mean(Petal.Length)), by = "Species"]

 

Por fim, é possível exportar um objeto data.table para outros tipos de arquivos através da função fwrite

</pre>
iris_table_ <- iris_table[Sepal.Length > 6.5, .(Species, Sepal.Length)]

fwrite(iris_table_, "iris_table_.csv")
<pre>

___________________

Quer aprender mais sobre o pacote {data.table} e aprender a realizar análise de dados em grandes conjuntos de dados? Veja nossos Cursos de Microdados Aplicados.

___________________

Compartilhe esse artigo

Facebook
Twitter
LinkedIn
WhatsApp
Telegram
Email
Print

Comente o que achou desse artigo

Outros artigos relacionados

Como selecionar variáveis para modelos de previsão no Python?

Em oposição à crença popular, grande parte dos modelos de machine learning não produzem previsões magicamente. É papel do cientista de dados executar uma boa engenharia de variáveis para não cair no clássico problema de “garbage in, garbage out” (GIGO) em aprendizado de máquina. Neste sentido, aprender a fazer uma boa seleção de variáveis é fundamental e neste artigo exploramos algumas possibilidades práticas usando o Python.

Resultado IPCA-15 - Novembro/2024

A Análise Macro apresenta os resultados do IPCA-15 de Novembro de 2024, com gráficos elaborados em Python para coleta, tratamento e visualização de dados. Todo o conteúdo, disponível exclusivamente no Clube AM, foi desenvolvido com base nos métodos ensinados nos cursos da Análise Macro, permitindo aos assinantes acesso aos códigos e replicação das análises.

Resultado PNADc Trimestral - 3° Trimestre/2024

A Análise Macro apresenta os resultados da PNADc Trimestral do 3º trimestre de 2024, com gráficos elaborados em Python para coleta, tratamento e visualização de dados. Todo o conteúdo, disponível exclusivamente no Clube AM, foi desenvolvido com base nos métodos ensinados nos cursos da Análise Macro, permitindo aos assinantes acesso aos códigos e replicação das análises.

Boletim AM

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais e conteúdos exclusivos sobre Análise de Dados!

Boletim AM

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais e conteúdos exclusivos sobre Análise de Dados!

como podemos ajudar?

Preencha os seus dados abaixo e fale conosco no WhatsApp

Boletim AM

Preencha o formulário abaixo para receber nossos boletins semanais diretamente em seu e-mail.