Szukaj…


Uwagi

Przypomnienie: składnia DT[where, select|update|do, by] jest używana do pracy z kolumnami tabeli danych.

  • Część „gdzie” to argument i
  • Część „select | update | do” jest argumentem j

Te dwa argumenty są zwykle przekazywane według pozycji zamiast nazwy.

Zliczanie wierszy według grupy

# example data
DT = data.table(iris)
DT[, Bin := cut(Sepal.Length, c(4,6,8))]

Korzystanie z .N

.N w j przechowuje liczbę wierszy w podzbiorze. Podczas eksploracji danych, .N jest przydatny do ...

  1. policzyć rzędy w grupie,

    DT[Species == "setosa", .N]
    
    # 50
    
  2. lub policz wiersze we wszystkich grupach,

    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. lub znajdź grupy, które mają określoną liczbę wierszy.

    DT[, .N, by=.(Species, Bin)][ N < 25 ]
    
    #       Species   Bin  N
    # 1: versicolor (6,8] 20
    # 2:  virginica (4,6]  9
    

Obsługa brakujących grup

Jednak brakuje nam grup z liczbą zero powyżej. Jeśli mają znaczenie, możemy użyć table od podstawy:

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

Alternatywnie możemy dołączyć do wszystkich grup:

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

Uwaga na temat .N :

  • W tym przykładzie użyto .N w j , w którym odnosi się do rozmiaru podgrupy.
  • W i odnosi się do całkowitej liczby wierszy.

Niestandardowe streszczenia

# example data
DT = data.table(iris)
DT[, Bin := cut(Sepal.Length, c(4,6,8))]

Załóżmy, że chcemy otrzymać wynik funkcji summary dla Sepal.Length wraz z liczbą obserwacji:

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

Musimy sprawić, aby j listę kolumn. Zwykle niektórzy bawią się c , as.list i . wystarczy, aby znaleźć właściwy sposób postępowania.

Przypisywanie statystyk podsumowujących jako nowych kolumn

Zamiast tworzyć tabelę podsumowań, możemy chcieć przechowywać statystyki podsumowania w nowej kolumnie. Możemy użyć := jak zwykle. Na przykład,

DT[, is_big := .N >= 25, by=.(Species, Bin)]

Pułapki

Nieuporządkowane dane

Jeśli chcesz przeanalizować nazwy kolumn, na przykład

Weź średnią x.Length/x.Width gdzie x przyjmuje dziesięć różnych wartości.

prawdopodobnie patrzysz na dane osadzone w nazwach kolumn, co jest złym pomysłem. Przeczytaj o uporządkowanych danych, a następnie przekształć je w długi format.

Wiersze podsumowania

Ramki danych i tabele danych są dobrze zaprojektowane dla danych tabelarycznych, w których wiersze odpowiadają obserwacjom, a kolumny zmiennym. Jeśli chcesz podsumować wiersze, na przykład

Znajdź odchylenie standardowe między kolumnami dla każdego wiersza.

to prawdopodobnie powinieneś w pełni korzystać z macierzy lub innego formatu danych.

Funkcja podsumowania

# example data
DT = data.table(iris)
DT[, Bin := cut(Sepal.Length, c(4,6,8))]

summary jest przydatne do przeglądania statystyk podsumowań. Oprócz bezpośredniego użycia, takiego jak summary(DT) , można go również wygodnie zastosować do grupy z split :

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

Aby uwzględnić grupy liczone od zera, ustaw drop=FALSE w split .

Zastosowanie funkcji podsumowującej do wielu zmiennych

# example data
DT = data.table(iris)
DT[, Bin := cut(Sepal.Length, c(4,6,8))]

Aby zastosować tę samą funkcję podsumowania do każdej kolumny według grupy, możemy użyć lapply i .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

Możemy filtrować kolumny w .SD za pomocą argumentu .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

Wiele funkcji podsumowujących

Obecnie najprostszym rozszerzeniem wielu funkcji jest być może:

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

Jeśli chcesz, aby nazwy były jak Petal.Length.med zamiast med.Petal.Length , zmień kolejność:

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow