Data.table is een R package dat gebruikt wordt voor het werken met data in tabelvorm in R. Het levert het efficiënte data.table object dat een veel verbeterde versie is van het object data.frame dat standaard met R wordt geleverd. Het is supersnel en heeft een intuïtieve en beknopte syntaxis. Als je de taal R kent en het data.table pakket nog niet hebt opgepikt, dan is deze handleiding een goede plaats om te beginnen.
We zullen het hebben over:
- Waarom data.table in R?
- Data importeren met data.table
- Converteren tussen data.frame en data.table
- Rijen filteren aan de hand van condities
- Kolommen selecteren
- Meerdere kolommen selecteren
- Kolommen verwijderen
- Kolommen hernoemen
Waarom data.table?
De data.table is een alternatief voor R's standaard data.frame om gegevens in tabelvorm te verwerken. De reden achter de populariteit van data.table is de verbeterde snelheid en de beknopte syntaxis in vergelijking met de standaard dataframes in R. Je typt dus effectief minder code en krijgt een veel hogere snelheid. Het is een van de meest gedownloade pakketten in R en geniet de voorkeur van veel Data Scientists.
Hoewel data.table een iets andere syntaxis heeft dan het gewone R dataframe, is deze heel intuïtief. Als je de workflow eenmaal door hebt, voelt werken met data.tables heel vanzelfsprekend en natuurlijk aan. Wij durven zelfs te stellen dat je na het gebruik van data.table nooit meer terug wil naar de basis R data.frame syntaxis.
Tegen het einde van deze gids zal je de fundamentele syntax van data.table en de structuur erachter begrijpen. Alle kernfuncties voor datamanipulatie van data.table, in welke scenario's ze gebruikt worden en hoe ze te gebruiken, met ook enkele geavanceerde trucs en tips.
Data importeren
De manier waarop je met data.tables werkt is verschillend van de manier waarop je met data.frames zou werken. Als eerste is het belangrijk om dit verschil begrijpen om er voor te zorgen dat je dit package onder de knie krijgt.
De R functie fread()
, kort voor fast read, is data.tables versie van read.csv()
.
Net als read.csv()
werkt het zowel voor een bestand op je lokale computer als voor een bestand gehost op het internet. Bovendien is fread()
minstens 20 keer zo snel als de standaard read.csv()
.
Als voorbeeld gaan we een csv bestand importeren in data.table. Dit bestand is gehost op Github. Je zult zien dat de geïmporteerde dataset rechtstreeks wordt opgeslagen als een data.table object.
library(data.table)
mt <- fread("https://raw.githubusercontent.com/selva86/datasets/master/mtcars.csv")
head(mt)
Omdat de dataset die we importeerden klein was, zou de (trage) snelheid van read.csv() ook goed genoeg zijn geweest. De snelheidswinst wordt pas duidelijk wanneer je een grote dataset importeert (bestaand uit miljoenen+ rijen).
Om een idee te krijgen van hoe snel fread()
is, voeren we onderstaande code uit. Het creëert een csv bestand dat bestaat uit een miljoen rijen. Vervolgens lezen we dit bestand in met zowel de fread()
als read.csv()
functies. De tijd die de fread()
en read.csv()
functies in beslag nemen wordt in de console afgedrukt.
# Maak een groot csv-bestand
random_data <- data.frame(matrix(runif(10000000), nrow=1000000))
write.csv(random_data, 'random.csv', row.names = F)
# Importeren met read.csv()
system.time({m_df <- read.csv('random.csv')})
#> user system elapsed
#> 39.798 1.326 43.003
# Importeren met fread()
system.time({m_dt <- fread('random.csv')})
#> user system elapsed
#> 1.735 0.097 1.877
Zoals je kunt zien is de tweede functie (fread()
van data.table) 20x sneller dan read.csv()
. Bovendien wordt deze tijdswinst alsmaar groter naarmate de bestandsgrootte toeneemt.
Converteren tussen data.frame en data.table
Je kunt elk data.frame
omzetten in data.table
door gebruik te maken van een van de volgende methoden:
data.table(df)
ofas.data.table(df)
setDT(df)
Het verschil tussen de twee benaderingen is: de functie data.table(df)
maakt een kopie van df en converteert het naar een data.table. Dit terwijl setDT(df)
het dataframe inplace converteert naar een data.table. Dat betekent dat df
zelf wordt geconverteerd naar een data.table en dat je het niet hoeft toe te wijzen aan een ander object. Het resultaat is dat er geen kopie wordt gemaakt en dat de data niet wordt gedupliceerd.
mtcars$carname <- rownames(mtcars)
mtcars_dt <- as.data.table(mtcars)
# andere manier
mtcars_copy <- copy(mtcars)
setDT(mtcars_copy)
Rijen filteren aan de hand van condities
Het grootste verschil tussen data.table en het standaard R dataframe is dat data.table zich bewust is van de kolomnamen.
Dit betekent dat je bij het filteren enkel de kolomnamen kan weergeven zonder opnieuw de naam van het dataframe zelf te noemen. Dit verschil werkt als volgt:
# dataframe syntax
mtcars[mtcars$cyl == 6 & mtcars$gear == 4, ]
# datatable syntax
mtcars_dt[cyl==6 & gear==4, ]
Dit scheelt een op tijd en werkt gewoon fijner.
Kolommen selecteren
In het begin zal je het waarschijnlijk verwarrend vinden dat je bij data.table kolommen niet kan selecteren aan de hand van hun numerieke positie (van links naar rechts). Als voorbeeld kan je het volgende verwachten in een standaard R dataframe.
mtcars[, 1]
# <returned first column>
Maar bij data.table geeft dit simpelweg het nummer ‘1’ terug.
mtcars_dt[, 1]
#> 1
Als je toch op numerieke positie wilt selecteren zul je een extra argument moeten meegeven binnen de blokhaken, namelijk with=FALSE
.
mtcars_dt[, 1, with=F]
# <returned first column>
De beste werkwijze is echter om de daadwerkelijke kolomnaam te gebruiken bij het selecteren op kolom.
mtcars_dt[, mpg]
Let wel op dat in het voorbeeld hierboven ‘mpg’ geen string is; er staan geen aanhalingstekens omheen.
Meerdere kolommen selecteren
Je kunt ook een variabele gebruiken om te selecteren op kolom. In dit geval moet je wel weer het extra argument with=FALSE
meegeven. Dit doe je als volgt:
myvar <- "mpg"
mtcars_dt[, myvar, with=F]
# <returned mpg column>
Dezelfde werkwijze geldt voor het selecteren op meerdere kolommen:
kolommen <- c('mpg', 'cyl', 'disp')
mtcars_dt[, kolommen]
#> [1] "mpg" "cyl" "disp"
Let op dat je het argument with=FALSE
niet vergeet mee te geven.
mtcars_dt[, columns, with=FALSE]
Wil je meerdere kolommen selecteren zonder een extra variabele aan te maken? Dit doe je door ze in een list mee te geven. Dit doe je als volgt:
# syntax 1:
mtcars_dt[1:4, list(mpg, cyl, gear)]
# of
# syntax 2: meest gebruikelijke werkwijze
mtcars_dt[, .(mpg, cyl, gear)]
Kolommen verwijderen
Wil je in plaats van kolommen te selecteren ze juist verwijderen?
Plaats ze dan in een vector en gebruik het uitroepteken (!). Dit zorgt er voor dat alle kolommen behalve de gespecificeerde kolommen worden geselecteerd.
drop_cols <- c("mpg", "cyl", "gear")
mtcars_dt[, !drop_cols, with=FALSE]
Kolommen hernoemen
De functie setnames()
wordt gebruikt voor het hernoemen van kolommen.
De argumenten zijn: de data.table (of data.frame), de huidige naam van een kolom en de nieuwe naam van deze kolom. Het verandert de naam (of namen) in place en dupliceert of kopieert dus geen data.
setnames(mtcars_dt, 'vs', 'engine_type')
colnames(mtcars_dt)
#> <'vs' column heet nu 'engine_type'.
Samenvatting
Data.table is een package wat een alternatief biedt voor de standaard dataframes in R. Data.tables zijn veel efficienter en sneller dan dataframes maar zijn ook gemakkelijk om te zetten naar dataframes en vice versa.
Terry is afgestudeerd aan de TU Delft als ingenieur en heeft zich in zijn carrière beziggehouden met het optimaal benutten van data om bedrijfsprestaties te verbeteren. Dit heeft hij gedaan in verschillende rollen, als software ontwikkelaar en als data scientist.