Data.table vs data frame dans R : trois différences clés
Dans le langage de programmation R, un data.frame fait partie de la base R.
N’importe quel data.frame peut être converti en data.table à l’aide de la fonction setDF du package data.table .
Un data.table offre les avantages suivants par rapport à un data.frame dans R :
1. Vous pouvez utiliser la fonction fread du package data.table pour lire un fichier dans un data.table beaucoup plus rapidement que les fonctions de base R telles que read.csv , qui lisent les fichiers dans un data.frame.
2. Vous pouvez effectuer des opérations (telles que le regroupement et l’agrégation) sur une data.table beaucoup plus rapidement qu’une data.frame.
3. Lors de l’impression d’un data.frame sur une console, R tentera d’afficher chaque ligne du data.frame. Cependant, un data.table n’affichera que les 100 premières lignes, ce qui peut empêcher votre session de se bloquer ou de planter si vous travaillez avec un ensemble de données volumineux.
Les exemples suivants illustrent ces différences entre data.frames et data.tables dans la pratique.
Différence n°1 : importation plus rapide avec la fonction fread
Le code suivant montre comment importer un bloc de données de 10 000 lignes et 100 colonnes à l’aide de la fonction fread du package data.table et de la fonction read.csv de la base R :
library(microbenchmark) library(data.table) #make this example reproducible set.seed(1) #create data frame with 10,000 rows and 100 columns df <- as.data.frame(matrix(runif(10^4 * 100), nrow = 10^4)) #export CSV to current working directory write.csv(df, "test.csv", quote = FALSE) #import CSV file using fread and read.csv and time how long it takes results <- microbenchmark( read.csv = read.csv("test.csv", header = TRUE, stringsAsFactors = FALSE), fread = fread("test.csv", sep = ",", stringsAsFactors = FALSE), times = 10) #view results results Unit: milliseconds expr min lq mean median uq max neval cld read.csv 817.1867 892.8748 1026.7071 899.5755 926.9120 1964.0540 10 b fread 113.5889 116.2735 136.4079 124.3816 136.0534 211.7484 10 a
D’après les résultats, nous pouvons voir que fread est environ 10 fois plus rapide pour importer ce fichier CSV par rapport à la fonction read.csv .
Notez que cette différence sera encore plus grande pour les ensembles de données plus volumineux.
Différence n°2 : manipulation des données plus rapide avec data.table
En général, data.table peut également effectuer n’importe quelle tâche de manipulation de données beaucoup plus rapidement qu’un data.frame .
Par exemple, le code suivant montre comment calculer la moyenne d’une variable, regroupée par une autre variable à la fois dans data.table et data.frame :
library(microbenchmark)
library(data.table)
#make this example reproducible
set.seed(1)
#create data frame with 10,000 rows and 100 columns
d_frame <- data.frame(team=rep(c('A', 'B'), each=5000),
points=c(rnorm(10000, mean=20, sd=3)))
#create data.table from data.frame
d_table <- setDT(d_frame)
#calculate mean of points grouped by team in data.frame and data.table
results <- microbenchmark(
mean_d_frame = aggregate(d_frame$points, list(d_frame$team), FUN=mean),
mean_d_table = d_table[ ,list(mean=mean(points)), by=team],
times = 10)
#view results
results
Unit: milliseconds
expr min lq mean median uq max neval cld
mean_d_frame 2.9045 3.0077 3.11683 3.1074 3.1654 3.4824 10 b
mean_d_table 1.0539 1.1140 1.52002 1.2075 1.2786 3.6084 10 a
D’après les résultats, nous pouvons voir que data.table est environ trois fois plus rapide que data.frame .
Pour les ensembles de données plus volumineux, cette différence sera encore plus grande.
Différence n°3 : moins de lignes imprimées avec data.table
Lors de l’impression d’un data.frame sur une console, R tentera d’afficher chaque ligne du data.frame.
Cependant, un data.table n’affichera que les 100 premières lignes, ce qui peut empêcher votre session de se bloquer ou de planter si vous travaillez avec un ensemble de données volumineux.
Par exemple, dans le code suivant, nous créons à la fois un bloc de données et un data.table de 200 lignes.
Lors de l’impression du data.frame, R tentera d’imprimer chaque ligne tandis que l’impression du data.table n’affichera que les cinq premières lignes et les cinq dernières lignes :
library(data.table) #make this example reproducible set.seed(1) #create data frame d_frame <- data.frame(x=rnorm(200), y=rnorm(200), z=rnorm(200)) #view data frame d_frame x y z 1 -0.055303118 1.54858564 -2.065337e-02 2 0.354143920 0.36706204 -3.743962e-01 3 -0.999823809 -1.57842544 4.392027e-01 4 2.586214840 0.17383147 -2.081125e+00 5 -1.917692199 -2.11487401 4.073522e-01 6 0.039614766 2.21644236 1.869164e+00 7 -1.942259548 0.81566443 4.740712e-01 8 -0.424913746 1.01081030 4.996065e-01 9 -1.753210825 -0.98893038 -6.290307e-01 10 0.232382655 -1.25229873 -1.324883e+00 11 0.027278832 0.44209325 -3.221920e-01 ... #create data table d_table <- setDT(d_frame) #view data table d_table x y z 1: -0.05530312 1.54858564 -0.02065337 2: 0.35414392 0.36706204 -0.37439617 3: -0.99982381 -1.57842544 0.43920275 4: 2.58621484 0.17383147 -2.08112491 5: -1.91769220 -2.11487401 0.40735218 --- 196: -0.06196178 1.08164065 0.58609090 197: 0.34160667 -0.01886703 1.61296255 198: -0.38361957 -0.03890329 0.71377217 199: -0.80719743 -0.89674205 -0.49615702 200: -0.26502679 -0.15887435 -1.73781026
Il s’agit d’un avantage qu’offre data.table par rapport à data.frame , en particulier lorsque vous travaillez avec des ensembles de données volumineux que vous ne souhaitez pas imprimer accidentellement sur la console.
Ressources additionnelles
Les didacticiels suivants expliquent comment effectuer d’autres tâches courantes dans R :
Comment ajouter des lignes à un bloc de données dans R
Comment conserver certaines colonnes dans R
Comment sélectionner uniquement les colonnes numériques dans R