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 automatizar tarefas repetitivas usando Python? Um exemplo para largar o Excel

Manter relatórios diários com dados e análises atualizados é um desafio, pois envolve várias etapas: coleta de dados, tratamento de informações, produção de análises e atualização de relatório. Para superar este desafio algumas ferramentas como Python + Quarto + GitHub podem ser usadas para automatizar tudo que for automatizável. Neste artigo mostramos um exemplo com dados do mercado financeiro.

Criando um Dashboard de análise de Ações no Python

Um Dashboard é um painel de controle que consolida uma variedade de informações sobre um determinado objeto de estudo em um ou mais painéis. Ele simplifica significativamente o processo de análise de dados, oferecendo uma visão global e fácil de entender. Uma maneira simples de construir um Dashboard para acompanhar uma ação específica é utilizando duas ferramentas: Quarto e Python. Neste post, mostramos o resultado da criação de um Dashboard de Ação.

Analisando séries temporais no Python e esquecendo de vez o Excel

Séries temporais representam uma disciplina extremamente importante em diversas áreas, principalmente na economia e na ciência de dados. Mas, afinal, como lidar com esses dados que se apresentam ao longo do tempo? Neste exercício, demonstraremos como compreender uma série temporal e como o Python se destaca como uma das melhores ferramentas para analisar esse tipo de dado.

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.