Este tutorial de data.table em R explica o básico do comando DT[i, j, by], que é o coração do pacote data.table. Se você quiser aprender mais sobre o pacote, a DataCamp oferece um curso interativo de R sobre o pacote data.table. O curso tem mais de 35 exercícios interativos em R — todos no conforto do seu navegador — e vários vídeos com MattDowle, autor principal do data.table, e Arun Srinivasan, grande colaborador. Experimente grátis.
Se você já trabalhou com conjuntos de dados grandes em RAM (de 1 a mais de 100 GB), sabe que um data.frame pode ser limitante: algumas operações demoram demais. O data.table resolve isso reduzindo o tempo de computação. E mais: ele também facilita fazer mais com menos digitação. Depois que você dominar a sintaxe do data.table neste tutorial, a simplicidade de realizar operações complexas vai te surpreender. Assim, você reduz não só o tempo de processamento, mas também o tempo de programação.
O comando DT[i,j,by] tem três partes: i, j e by. Pensando em termos de SQL, i corresponde ao WHERE, j ao SELECT e by ao GROUP BY. Costumamos descrever o comando assim: “Pegue DT, faça o subconjunto das linhas usando ‘i’, depois calcule ‘j’ agrupado por ‘by’”. Num exemplo simples, usando o conjunto de dados hflights (assim você consegue reproduzir tudo), temos:
UniqueCarrier V1
AA 68.76471
AS 255.29032
B6 176.93548
CO 141.52861...Tecnologia
Aqui, filtramos a data table para manter só as linhas do 10º mês do ano, calculamos o tempo médio em voo (AirTime) dos aviões que realmente voaram (por isso usamos na.omit() — voos cancelados não têm valor de AirTime) e agrupamos os resultados por companhia aérea. Dá para ver, por exemplo, que a AA (American Airlines) tem um AirTime médio bem menor que a AS (Alaska Airlines). Reparou também que funções da base do R podem ser usadas na parte j? Já chegamos lá.
A parte i
A parte ‘i’ é usada para filtrar linhas, do mesmo jeito que em um data frame.
#Retorna todas as linhas em que a companhia é American Airlines
Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum TailNum ActualElapsedTime
201111614001500 AA 428 N576AA 60201112714011501 AA 428 N557AA 60201113113521502 AA 428 N541AA 70201114214031513 AA 428 N403AA 70201115314051507 AA 428 N492AA 62---20111227210211333 AA 2234 N3ETAA 13220111228310151329 AA 2234 N3FJAA 13420111229410231335 AA 2234 N3GSAA 13220111230510241334 AA 2234 N3BAAA 13020111231610241343 AA 2234 N3HNAA 139
AirTime ArrDelay DepDelay Origin Dest Distance TaxiIn TaxiOut Cancelled CancellationCode Diverted
40-100 IAH DFW 2247130045-91 IAH DFW 224690048-8-8 IAH DFW 224517003933 IAH DFW 2249220044-35 IAH DFW 2249900---112-121 IAH MIA 96481200112-16-5 IAH MIA 96491300110-103 IAH MIA 964121000110-114 IAH MIA 96491100119-24 IAH MIA 96481200Tecnologia
Perceba que você não precisa usar vírgula para filtrar linhas em uma data table. Em um data.frame, fazer DF[2:5] retornaria todas as linhas das colunas 2 a 5. Em vez disso (como todo mundo aqui sabe), precisamos especificar DF[2:5,]. Note também que DT[,2:5] não significa nada para data tables, como explicado na primeira pergunta do FAQ do pacote data.table.
Curioso e útil: ao filtrar linhas, você pode usar o símbolo .N no comando DT[…], que representa o número de linhas ou a última linha. Dá para usá-lo para pegar a última linha ou um deslocamento a partir dela.
#Retorna a penúltima linha de DT
Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum TailNum ActualElapsedTime AirTime
20111262656812 WN 621 N727SW 7664
ArrDelay DepDelay Origin Dest Distance TaxiIn TaxiOut Cancelled CancellationCode Diverted
-13-4 HOU TUL 4533900Tecnologia
A parte j
A parte ‘j’ é usada para selecionar colunas e fazer coisas com elas. E coisas aqui pode ser praticamente qualquer operação. Todo tipo de função pode ser usada — esse é um dos grandes pontos fortes do data.table.
Note que a parte ‘i’ ficou em branco e a primeira coisa entre colchetes é uma vírgula. Parece contraintuitivo no início, mas isso só quer dizer que não estamos filtrando nenhuma linha — ou seja, todas as linhas estão selecionadas. Na parte ‘j’, calculamos o atraso médio na chegada de todos os voos. Parece que, em média, os voos do conjunto hflights atrasaram mais de 7 minutos. Se prepare para o seu próximo embarque!
Ao selecionar várias colunas e fazer coisas com elas na parte ‘j’, você precisa usar a notação ‘.()’. Essa notação é, na verdade, um atalho para ‘list()’. Ela retorna uma data table; já sem usar ‘.()’ o retorno é apenas um vetor, como vimos acima.
Aqui, pegamos DT, selecionamos todas as linhas em que a companhia era AA na parte ‘i’, calculamos o atraso médio na saída e na chegada, e plotamos o horário de decolagem versus o atraso na decolagem na parte ‘j’.
Resumindo: a parte ‘j’ serve para fazer cálculos sobre as colunas especificadas ali. Como as colunas de uma data table são vistas como variáveis e as partes de ‘j’ são avaliadas como expressões, praticamente qualquer coisa pode ser feita na parte ‘j’. Isso encurta bastante seu tempo de programação.
A parte by
A seção final deste tutorial de data.table em R foca na parte ‘by’. A parte ‘by’ é usada quando queremos calcular a expressão de ‘j’ agrupada por uma variável específica (ou por uma transformação dessa variável). Você vai ver que a expressão ‘j’ é repetida para cada grupo de ‘by’. Usar é simples: basta indicar a coluna pela qual você quer agrupar no argumento ‘by’.
Aqui, calculamos o atraso médio antes da decolagem, mas agrupado pela origem do voo. Parece que os voos que partem de HOU têm um atraso médio maior do que os que saem de IAH.
Assim como na parte ‘j’, dá para fazer muita coisa em ‘by’. Funções podem ser usadas em ‘by’ para que os resultados das operações feitas em ‘j’ sejam agrupados por algo que especificamos dentro do comando DT[…]. Usar funções dentro de DT[…] deixa essa única linha muito poderosa. Da mesma forma, a notação ‘.()’ precisa ser usada quando você agrupa por várias colunas.
Aqui, primeiro calculamos o atraso médio antes da decolagem de todos os voos (sem filtro em ‘i’, então todas as linhas foram selecionadas) e, em seguida, agrupamos: primeiro pela origem e depois por dia da semana. Weekdays é False nos fins de semana. Parece que o atraso médio antes da decolagem foi maior quando o voo saiu de HOU do que de IAH e, surpreendentemente, os atrasos foram menores nos fins de semana.
Juntando tudo, um comando típico DT[i,j,by] fica assim:
Aqui, o subconjunto de voos operados pela Delta Air Lines (selecionado em ‘i’) foi agrupado pela origem e por Weekdays (em ‘by’). Também calculamos o tempo “compensado” em voo (em ‘j’). Parece que, nos fins de semana — independentemente de sair de IAH ou HOU — o tempo compensado enquanto no ar (voando mais rápido) é maior.
Há muito mais para explorar no pacote data.table, mas este post mostrou o básico do comando DT[i,j,by]. O curso da DataCamp cobre o pacote inteiro em detalhes. Você pratica no seu ritmo, direto no navegador, recebe dicas e feedback, e pode rever os vídeos e slides quando quiser. Esse formato interativo acelera seu aprendizado e dá experiência prática com data tables. Experimente grátis. Confira também o Cheat Sheet do pacote data.table em R.
Esperamos que, com este tutorial de data.table em R, você tenha entendido a sintaxe fundamental do data.table e esteja pronto para praticar. Se tiver dúvidas sobre o pacote, dê uma olhada aqui. Matt e Arun são bem ativos por lá. Um dos próximos posts sobre data.table será mais técnico, explorando a fundo as possibilidades com data tables. Fique de olho!
Explore a análise de dados com Python. Os DataFrames do Pandas facilitam a manipulação de seus dados, desde a seleção ou substituição de colunas e índices até a remodelagem dos dados.
Este tutorial de data.table em R explica o básico do comando
DT[i, j, by], que é o coração do pacote data.table. Se você quiser aprender mais sobre o pacote, a DataCamp oferece um curso interativo de R sobre o pacote data.table. O curso tem mais de 35 exercícios interativos em R — todos no conforto do seu navegador — e vários vídeos com Matt Dowle, autor principal do data.table, e Arun Srinivasan, grande colaborador. Experimente grátis.Se você já trabalhou com conjuntos de dados grandes em RAM (de 1 a mais de 100 GB), sabe que um
data.framepode ser limitante: algumas operações demoram demais. O data.table resolve isso reduzindo o tempo de computação. E mais: ele também facilita fazer mais com menos digitação. Depois que você dominar a sintaxe do data.table neste tutorial, a simplicidade de realizar operações complexas vai te surpreender. Assim, você reduz não só o tempo de processamento, mas também o tempo de programação.O comando
DT[i,j,by]tem três partes:i,jeby. Pensando em termos de SQL,icorresponde ao WHERE,jao SELECT ebyao GROUP BY. Costumamos descrever o comando assim: “Pegue DT, faça o subconjunto das linhas usando ‘i’, depois calcule ‘j’ agrupado por ‘by’”. Num exemplo simples, usando o conjunto de dadoshflights(assim você consegue reproduzir tudo), temos:Aqui, filtramos a data table para manter só as linhas do 10º mês do ano, calculamos o tempo médio em voo (AirTime) dos aviões que realmente voaram (por isso usamos
na.omit()— voos cancelados não têm valor de AirTime) e agrupamos os resultados por companhia aérea. Dá para ver, por exemplo, que a AA (American Airlines) tem um AirTime médio bem menor que a AS (Alaska Airlines). Reparou também que funções da base do R podem ser usadas na partej? Já chegamos lá.A parte i
A parte ‘i’ é usada para filtrar linhas, do mesmo jeito que em um data frame.
Você também pode usar nomes de colunas, pois eles são avaliados no escopo de DT.
Perceba que você não precisa usar vírgula para filtrar linhas em uma data table. Em um data.frame, fazer
DF[2:5]retornaria todas as linhas das colunas 2 a 5. Em vez disso (como todo mundo aqui sabe), precisamos especificarDF[2:5,]. Note também queDT[,2:5]não significa nada para data tables, como explicado na primeira pergunta do FAQ do pacote data.table.Curioso e útil: ao filtrar linhas, você pode usar o símbolo
.Nno comando DT[…], que representa o número de linhas ou a última linha. Dá para usá-lo para pegar a última linha ou um deslocamento a partir dela.A parte j
A parte ‘j’ é usada para selecionar colunas e fazer coisas com elas. E coisas aqui pode ser praticamente qualquer operação. Todo tipo de função pode ser usada — esse é um dos grandes pontos fortes do data.table.
Note que a parte ‘i’ ficou em branco e a primeira coisa entre colchetes é uma vírgula. Parece contraintuitivo no início, mas isso só quer dizer que não estamos filtrando nenhuma linha — ou seja, todas as linhas estão selecionadas. Na parte ‘j’, calculamos o atraso médio na chegada de todos os voos. Parece que, em média, os voos do conjunto hflights atrasaram mais de 7 minutos. Se prepare para o seu próximo embarque!
Ao selecionar várias colunas e fazer coisas com elas na parte ‘j’, você precisa usar a notação ‘
.()’. Essa notação é, na verdade, um atalho para ‘list()’. Ela retorna uma data table; já sem usar ‘.()’ o retorno é apenas um vetor, como vimos acima.Outro recurso útil que exige a notação ‘
.()’ permite renomear colunas dentro do comando DT[…].Claro, dar novos nomes às colunas é opcional.
Combinando o que vimos sobre ‘i’ e ‘j’, temos:
Aqui, pegamos DT, selecionamos todas as linhas em que a companhia era AA na parte ‘i’, calculamos o atraso médio na saída e na chegada, e plotamos o horário de decolagem versus o atraso na decolagem na parte ‘j’.
Resumindo: a parte ‘j’ serve para fazer cálculos sobre as colunas especificadas ali. Como as colunas de uma data table são vistas como variáveis e as partes de ‘j’ são avaliadas como expressões, praticamente qualquer coisa pode ser feita na parte ‘j’. Isso encurta bastante seu tempo de programação.
A parte by
A seção final deste tutorial de data.table em R foca na parte ‘by’. A parte ‘by’ é usada quando queremos calcular a expressão de ‘j’ agrupada por uma variável específica (ou por uma transformação dessa variável). Você vai ver que a expressão ‘j’ é repetida para cada grupo de ‘by’. Usar é simples: basta indicar a coluna pela qual você quer agrupar no argumento ‘by’.
Aqui, calculamos o atraso médio antes da decolagem, mas agrupado pela origem do voo. Parece que os voos que partem de HOU têm um atraso médio maior do que os que saem de IAH.
Assim como na parte ‘j’, dá para fazer muita coisa em ‘by’. Funções podem ser usadas em ‘by’ para que os resultados das operações feitas em ‘j’ sejam agrupados por algo que especificamos dentro do comando
DT[…]. Usar funções dentro deDT[…]deixa essa única linha muito poderosa. Da mesma forma, a notação ‘.()’ precisa ser usada quando você agrupa por várias colunas.Aqui, primeiro calculamos o atraso médio antes da decolagem de todos os voos (sem filtro em ‘i’, então todas as linhas foram selecionadas) e, em seguida, agrupamos: primeiro pela origem e depois por dia da semana. Weekdays é
Falsenos fins de semana. Parece que o atraso médio antes da decolagem foi maior quando o voo saiu de HOU do que de IAH e, surpreendentemente, os atrasos foram menores nos fins de semana.Juntando tudo, um comando típico
DT[i,j,by]fica assim:Aqui, o subconjunto de voos operados pela Delta Air Lines (selecionado em ‘i’) foi agrupado pela origem e por Weekdays (em ‘by’). Também calculamos o tempo “compensado” em voo (em ‘j’). Parece que, nos fins de semana — independentemente de sair de IAH ou HOU — o tempo compensado enquanto no ar (voando mais rápido) é maior.
Há muito mais para explorar no pacote data.table, mas este post mostrou o básico do comando
DT[i,j,by]. O curso da DataCamp cobre o pacote inteiro em detalhes. Você pratica no seu ritmo, direto no navegador, recebe dicas e feedback, e pode rever os vídeos e slides quando quiser. Esse formato interativo acelera seu aprendizado e dá experiência prática com data tables. Experimente grátis. Confira também o Cheat Sheet do pacote data.table em R.Esperamos que, com este tutorial de data.table em R, você tenha entendido a sintaxe fundamental do data.table e esteja pronto para praticar. Se tiver dúvidas sobre o pacote, dê uma olhada aqui. Matt e Arun são bem ativos por lá. Um dos próximos posts sobre data.table será mais técnico, explorando a fundo as possibilidades com data tables. Fique de olho!