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.
___________________