data.table
Auswertungsstatistik berechnen
Suche…
Bemerkungen
Eine Erinnerung: Die DT[where, select|update|do, by]
Syntax wird verwendet, um mit Spalten einer data.table zu arbeiten.
- "Wo" ist das
i
Argument - Der Teil "select | update | do" ist das Argument
j
Diese beiden Argumente werden normalerweise nach Position statt nach Name übergeben.
Zeilen nach Gruppe zählen
# example data
DT = data.table(iris)
DT[, Bin := cut(Sepal.Length, c(4,6,8))]
.N
.N
in j
speichert die Anzahl der Zeilen in einer Teilmenge. Bei der Erkundung von Daten ist .N
hilfreich für ...
zähle Reihen in einer Gruppe,
DT[Species == "setosa", .N] # 50
oder Zeilen in allen Gruppen zählen,
DT[, .N, by=.(Species, Bin)] # Species Bin N # 1: setosa (4,6] 50 # 2: versicolor (6,8] 20 # 3: versicolor (4,6] 30 # 4: virginica (6,8] 41 # 5: virginica (4,6] 9
oder Gruppen suchen, die eine bestimmte Anzahl von Zeilen haben.
DT[, .N, by=.(Species, Bin)][ N < 25 ] # Species Bin N # 1: versicolor (6,8] 20 # 2: virginica (4,6] 9
Umgang mit fehlenden Gruppen
Es fehlen jedoch Gruppen mit einem Zählwert von oben. Wenn sie wichtig sind, können wir die table
von der Basis aus verwenden:
DT[, data.table(table(Species, Bin))][ N < 25 ]
# Species Bin N
# 1: virginica (4,6] 9
# 2: setosa (6,8] 0
# 3: versicolor (6,8] 20
Alternativ können wir uns allen Gruppen anschließen:
DT[CJ(Species=Species, Bin=Bin, unique=TRUE), on=c("Species","Bin"), .N, by=.EACHI][N < 25]
# Species Bin N
# 1: setosa (6,8] 0
# 2: versicolor (6,8] 20
# 3: virginica (4,6] 9
Eine Anmerkung zu .N
:
- In diesem Beispiel wird
.N
inj
, wobei es sich auf die Größe einer Teilmenge bezieht. - In
i
bezieht sich dies auf die Gesamtzahl der Zeilen.
Benutzerdefinierte Zusammenfassungen
# example data
DT = data.table(iris)
DT[, Bin := cut(Sepal.Length, c(4,6,8))]
Angenommen, wir möchten die summary
Funktion für Sepal.Length
zusammen mit der Anzahl der Beobachtungen ausgeben:
DT[, c(
as.list(summary(Sepal.Length)),
N = .N
), by=.(Species, Bin)]
# Species Bin Min. 1st Qu. Median Mean 3rd Qu. Max. N
# 1: setosa (4,6] 4.3 4.8 5.0 5.006 5.2 5.8 50
# 2: versicolor (6,8] 6.1 6.2 6.4 6.450 6.7 7.0 20
# 3: versicolor (4,6] 4.9 5.5 5.6 5.593 5.8 6.0 30
# 4: virginica (6,8] 6.1 6.4 6.7 6.778 7.2 7.9 41
# 5: virginica (4,6] 4.9 5.7 5.8 5.722 5.9 6.0 9
Wir müssen dafür j
eine Liste der Spalten. Normalerweise spielen einige mit c
, as.list
und .
reicht aus, um den richtigen Weg zu finden.
Zuweisungsstatistik als neue Spalten zuweisen
Anstatt eine Übersichtstabelle zu erstellen, möchten wir möglicherweise eine Übersichtsstatistik in einer neuen Spalte speichern. Wir können wie immer :=
. Zum Beispiel,
DT[, is_big := .N >= 25, by=.(Species, Bin)]
Fallstricke
Unordnung von Daten
Wenn Sie möchten, Spaltennamen zu analysieren, wie
Nehmen Sie den Mittelwert von
x.Length/x.Width
wobeix
zehn verschiedene Werte annimmt.
dann sehen Sie wahrscheinlich Daten, die in Spaltennamen eingebettet sind, was keine gute Idee ist. Informieren Sie sich über aufgeräumte Daten und stellen Sie dann das lange Format wieder her.
Rowwise Zusammenfassungen
Datenrahmen und data.tables sind gut für tabellarische Daten ausgelegt, wobei Zeilen Beobachtungen und Spalten Variablen entsprechen. Wenn Sie sich über Zeilen hinweg zusammenfassen möchten, z
Ermitteln Sie die Standardabweichung zwischen den Spalten für jede Zeile.
dann sollten Sie wahrscheinlich eine Matrix oder ein anderes Datenformat verwenden.
Die zusammenfassende Funktion
# example data
DT = data.table(iris)
DT[, Bin := cut(Sepal.Length, c(4,6,8))]
summary
ist praktisch für das Durchsuchen von Übersichtsstatistiken. Neben der direkten Verwendung wie summary(DT)
kann sie auch bequem mit split
auf die einzelnen Gruppen angewendet werden:
lapply(split(DT, by=c("Species", "Bin"), drop=TRUE, keep.by=FALSE), summary)
# $`setosa.(4,6]`
# Sepal.Length Sepal.Width Petal.Length Petal.Width
# Min. :4.300 Min. :2.300 Min. :1.000 Min. :0.100
# 1st Qu.:4.800 1st Qu.:3.200 1st Qu.:1.400 1st Qu.:0.200
# Median :5.000 Median :3.400 Median :1.500 Median :0.200
# Mean :5.006 Mean :3.428 Mean :1.462 Mean :0.246
# 3rd Qu.:5.200 3rd Qu.:3.675 3rd Qu.:1.575 3rd Qu.:0.300
# Max. :5.800 Max. :4.400 Max. :1.900 Max. :0.600
#
# $`versicolor.(6,8]`
# Sepal.Length Sepal.Width Petal.Length Petal.Width
# Min. :6.10 Min. :2.20 Min. :4.000 Min. :1.20
# 1st Qu.:6.20 1st Qu.:2.80 1st Qu.:4.400 1st Qu.:1.30
# Median :6.40 Median :2.90 Median :4.600 Median :1.40
# Mean :6.45 Mean :2.89 Mean :4.585 Mean :1.42
# 3rd Qu.:6.70 3rd Qu.:3.10 3rd Qu.:4.700 3rd Qu.:1.50
# Max. :7.00 Max. :3.30 Max. :5.000 Max. :1.70
#
# [...results truncated...]
Um drop=FALSE
, setzen Sie drop=FALSE
in split
.
Anwenden einer Zusammenfassungsfunktion auf mehrere Variablen
# example data
DT = data.table(iris)
DT[, Bin := cut(Sepal.Length, c(4,6,8))]
Um dieselbe Zusammenfassungsfunktion für jede Spalte nach Gruppe anzuwenden, können wir lapply
und .SD
DT[, lapply(.SD, median), by=.(Species, Bin)]
# Species Bin Sepal.Length Sepal.Width Petal.Length Petal.Width
# 1: setosa (4,6] 5.0 3.4 1.50 0.2
# 2: versicolor (6,8] 6.4 2.9 4.60 1.4
# 3: versicolor (4,6] 5.6 2.7 4.05 1.3
# 4: virginica (6,8] 6.7 3.0 5.60 2.1
# 5: virginica (4,6] 5.8 2.7 5.00 1.9
Wir können die Spalten in .SD
mit dem Argument .SD
.SDcols
:
DT[, lapply(.SD, median), by=.(Species, Bin), .SDcols="Petal.Length"]
# Species Bin Petal.Length
# 1: setosa (4,6] 1.50
# 2: versicolor (6,8] 4.60
# 3: versicolor (4,6] 4.05
# 4: virginica (6,8] 5.60
# 5: virginica (4,6] 5.00
Mehrere Zusammenfassungsfunktionen
Derzeit ist die einfachste Erweiterung für mehrere Funktionen möglicherweise:
DT[, unlist(recursive=FALSE, lapply(
.(med = median, iqr = IQR),
function(f) lapply(.SD, f)
)), by=.(Species, Bin), .SDcols=Petal.Length:Petal.Width]
# Species Bin med.Petal.Length med.Petal.Width iqr.Petal.Length iqr.Petal.Width
# 1: setosa (4,6] 1.50 0.2 0.175 0.100
# 2: versicolor (6,8] 4.60 1.4 0.300 0.200
# 3: versicolor (4,6] 4.05 1.3 0.525 0.275
# 4: virginica (6,8] 5.60 2.1 0.700 0.500
# 5: virginica (4,6] 5.00 1.9 0.200 0.200
Wenn Sie möchten, dass die Namen Petal.Length.med
anstelle von med.Petal.Length
, ändern Sie die Reihenfolge:
DT[, unlist(recursive=FALSE, lapply(
.SD,
function(x) lapply(.(med = median, iqr = IQR), function(f) f(x))
)), by=.(Species, Bin), .SDcols=Petal.Length:Petal.Width]
# Species Bin Petal.Length.med Petal.Length.iqr Petal.Width.med Petal.Width.iqr
# 1: setosa (4,6] 1.50 0.175 0.2 0.100
# 2: versicolor (6,8] 4.60 0.300 1.4 0.200
# 3: versicolor (4,6] 4.05 0.525 1.3 0.275
# 4: virginica (6,8] 5.60 0.700 2.1 0.500
# 5: virginica (4,6] 5.00 0.200 1.9 0.200