data.table
Obliczanie statystyk podsumowujących
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 ...
policzyć rzędy w grupie,
DT[Species == "setosa", .N] # 50
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
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
wj
, 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
gdziex
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