Data.table vs. datenrahmen in r: drei wesentliche unterschiede


In der Programmiersprache R ist ein data.frame Teil der R-Datenbank.

Jeder data.frame kann mit der setDF- Funktion des data.table- Pakets in data.table konvertiert werden.

Eine data.table bietet gegenüber einem data.frame in R folgende Vorteile:

1. Sie können die fread- Funktion aus dem data.table-Paket verwenden, um eine Datei viel schneller in eine data.table einzulesen als grundlegende R-Funktionen wie read.csv , die Dateien in einen data.frame einlesen.

2. Sie können Vorgänge (z. B. Gruppierung und Aggregation) für eine Datentabelle viel schneller ausführen als für einen Datenrahmen.

3. Beim Drucken eines Datenrahmens auf einer Konsole versucht R, jede Zeile im Datenrahmen zu drucken. Eine data.table zeigt jedoch nur die ersten 100 Zeilen an, was dazu führen kann, dass Ihre Sitzung hängen bleibt oder abstürzt, wenn Sie mit einem großen Datensatz arbeiten.

Die folgenden Beispiele veranschaulichen diese Unterschiede zwischen data.frames und data.tables in der Praxis.

Unterschied Nr. 1: Schnellerer Import mit fread

Der folgende Code zeigt, wie ein Datenrahmen mit 10.000 Zeilen und 100 Spalten mithilfe der fread- Funktion aus dem data.table-Paket und der read.csv- Funktion aus der R-Datenbank importiert wird:

 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

Aus den Ergebnissen können wir ersehen, dass fread diese CSV-Datei im Vergleich zur Funktion read.csv etwa zehnmal schneller importiert.

Beachten Sie, dass dieser Unterschied bei größeren Datensätzen noch größer ist.

Unterschied Nr. 2: Schnellere Datenmanipulation mit data.table

Im Allgemeinen kann data.table jede Datenmanipulationsaufgabe auch viel schneller ausführen als ein data.frame .

Der folgende Code zeigt beispielsweise, wie der Durchschnitt einer Variablen berechnet wird, gruppiert nach einer anderen Variablen sowohl in data.table als auch 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

Aus den Ergebnissen können wir ersehen, dass data.table etwa dreimal schneller ist als data.frame .

Bei größeren Datensätzen wird dieser Unterschied noch größer sein.

Unterschied Nr. 3: Mit data.table werden weniger Zeilen gedruckt

Beim Drucken eines data.frame auf einer Konsole versucht R, jede Zeile im data.frame zu drucken.

Eine data.table zeigt jedoch nur die ersten 100 Zeilen an, was dazu führen kann, dass Ihre Sitzung hängen bleibt oder abstürzt, wenn Sie mit einem großen Datensatz arbeiten.

Im folgenden Code erstellen wir beispielsweise sowohl einen Datenrahmen als auch eine data.table mit 200 Zeilen.

Beim Drucken des data.frame versucht R, jede Zeile zu drucken, während beim Drucken der data.table nur die ersten fünf Zeilen und die letzten fünf Zeilen angezeigt werden:

 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

Dies ist ein Vorteil, den data.table gegenüber data.frame bietet, insbesondere wenn Sie mit großen Datensätzen arbeiten, die Sie nicht versehentlich auf der Konsole drucken möchten.

Zusätzliche Ressourcen

Die folgenden Tutorials erklären, wie Sie andere häufige Aufgaben in R ausführen:

So fügen Sie Zeilen zu einem Datenrahmen in R hinzu
So behalten Sie bestimmte Spalten in R bei
So wählen Sie in R nur numerische Spalten aus

Einen Kommentar hinzufügen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert