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 ...

  1. zähle Reihen in einer Gruppe,

    DT[Species == "setosa", .N]
    
    # 50
    
  2. 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
    
  3. 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 in j , 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 wobei x 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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow