data.table
Podzbiór wierszy według grupy
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.
Wybieranie wierszy w ramach każdej grupy
# example data
DT <- data.table(Titanic)
Załóżmy, że dla każdej płci chcemy wierszy o najwyższych liczbach przeżycia:
DT[Survived == "Yes", .SD[ N == max(N) ], by=Sex]
# Class Sex Age Survived N
# 1: Crew Male Adult Yes 192
# 2: 1st Female Adult Yes 140
.SD
jest podzbiór danych związanych z poszczególnymi Sex
; i dalej podporządkowujemy to wierszom, które spełniają nasz warunek. Jeśli prędkość jest ważna, zamiast tego użyj podejścia sugerowanego przez eddi na SO :
DT[ DT[Survived == "Yes", .I[ N == max(N) ], by=Sex]$V1 ]
# Class Sex Age Survived N
# 1: Crew Male Adult Yes 192
# 2: 1st Female Adult Yes 140
Pułapki
W ostatnim wierszu kodu .I
odnosi się do numerów wierszy pełnej tabeli danych. Jednak nie jest to prawdą, gdy nie ma jest by
:
DT[ Survived == "Yes", .I]
# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
DT[ Survived == "Yes", .I, by=Sex]$I
# 17 18 19 20 25 26 27 28 21 22 23 24 29 30 31 32
Wybieranie grup
# example data
DT = data.table(Titanic)
Załóżmy, że chcemy zobaczyć tylko drugą klasę:
DT[ Class == "2nd" ]
# Class Sex Age Survived N
# 1: 2nd Male Child No 0
# 2: 2nd Female Child No 0
# 3: 2nd Male Adult No 154
# 4: 2nd Female Adult No 13
# 5: 2nd Male Child Yes 11
# 6: 2nd Female Child Yes 13
# 7: 2nd Male Adult Yes 14
# 8: 2nd Female Adult Yes 80
Tutaj po prostu podzestawiamy dane za pomocą i
, klauzuli „where”.
Wybieranie grup według warunków
# example data
DT = data.table(Titanic)
Załóżmy, że chcemy zobaczyć każdą klasę tylko wtedy, gdy przeżyje większość:
DT[, if (sum(N[Survived=="Yes"]) > sum(N[Survived=="No"]) ) .SD, by=Class]
# Class Sex Age Survived N
# 1: 1st Male Child No 0
# 2: 1st Female Child No 0
# 3: 1st Male Adult No 118
# 4: 1st Female Adult No 4
# 5: 1st Male Child Yes 5
# 6: 1st Female Child Yes 1
# 7: 1st Male Adult Yes 57
# 8: 1st Female Adult Yes 140
Tutaj zwracamy podzbiór danych .SD
tylko wtedy, gdy nasz warunek jest spełniony. Alternatywą jest
DT[, .SD[ sum(N[Survived=="Yes"]) > sum(N[Survived=="No"]) ) ], by=Class]
ale czasem okazało się to wolniejsze.