Data.table vs data frame in r: tre differenze chiave
Nel linguaggio di programmazione R, un data.frame fa parte del database R.
Qualsiasi data.frame può essere convertito in data.table utilizzando la funzione setDF del pacchetto data.table .
Un data.table offre i seguenti vantaggi rispetto a un data.frame in R:
1. È possibile utilizzare la funzione fread dal pacchetto data.table per leggere un file in un data.table molto più velocemente delle funzioni R di base come read.csv , che leggono i file in un data.frame.
2. È possibile eseguire operazioni (come raggruppamento e aggregazione) su un data.table molto più velocemente di un data.frame.
3. Quando si stampa un data.frame su una console, R tenterà di stampare ogni riga nel data.frame. Tuttavia, un data.table mostrerà solo le prime 100 righe, il che potrebbe impedire il blocco o l’arresto anomalo della sessione se stai lavorando con un set di dati di grandi dimensioni.
Gli esempi seguenti illustrano nella pratica queste differenze tra data.frames e data.tables.
Differenza n. 1: importazione più rapida con fread
Il codice seguente mostra come importare un frame di dati di 10.000 righe e 100 colonne utilizzando la funzione fread dal pacchetto data.table e la funzione read.csv dal database R:
library (microbenchmark) library (data.table) #make this example reproducible set. seeds (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.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
Dai risultati, possiamo vedere che fread è circa 10 volte più veloce nell’importare questo file CSV rispetto alla funzione read.csv .
Tieni presente che questa differenza sarà ancora maggiore per set di dati più grandi.
Differenza n. 2: manipolazione dei dati più rapida con data.table
In generale, data.table può anche eseguire qualsiasi attività di manipolazione dei dati molto più velocemente di data.frame .
Ad esempio, il codice seguente mostra come calcolare la media di una variabile, raggruppata da un’altra variabile sia in data.table che in 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
Dai risultati, possiamo vedere che data.table è circa tre volte più veloce di data.frame .
Per set di dati più grandi, questa differenza sarà ancora maggiore.
Differenza n. 3: meno righe stampate con data.table
Quando si stampa un data.frame su una console, R tenterà di stampare ogni riga nel data.frame.
Tuttavia, un data.table mostrerà solo le prime 100 righe, il che potrebbe impedire il blocco o l’arresto anomalo della sessione se stai lavorando con un set di dati di grandi dimensioni.
Ad esempio, nel codice seguente creiamo sia un data frame che una data.table di 200 righe.
Quando si stampa data.frame, R tenterà di stampare ogni riga mentre stampando data.table verranno visualizzate solo le prime cinque righe e le ultime cinque righe:
library (data.table) #make this example reproducible set. seeds (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
Questo è un vantaggio offerto da data.table rispetto a data.frame , soprattutto quando si lavora con set di dati di grandi dimensioni che non si desidera stampare accidentalmente sulla console.
Risorse addizionali
I seguenti tutorial spiegano come eseguire altre attività comuni in R:
Come aggiungere righe a un frame di dati in R
Come preservare alcune colonne in R
Come selezionare solo colonne numeriche in R