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
iArgument - 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] # 50oder 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] 9oder 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
.Ninj, wobei es sich auf die Größe einer Teilmenge bezieht. - In
ibezieht 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.Widthwobeixzehn 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