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

Ajouter un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *