data.table
Подмножество строк по группам
Поиск…
замечания
Напоминание: синтаксис DT[where, select|update|do, by]
используется для работы с столбцами таблицы данных.
- Часть «где» является аргументом
i
- Часть «select | update | do» является аргументом
j
Эти два аргумента обычно передаются положением вместо имени.
Выбор строк в каждой группе
# example data
DT <- data.table(Titanic)
Предположим, что для каждого пола нам нужны строки с наивысшими числами выживаемости:
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
- это подмножество данных, связанных с каждым Sex
; и мы подмножаем это дальше, на строки, соответствующие нашему условию. Если скорость важна, вместо этого используйте подход, предложенный eddi на 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
Ловушки
В последней строке кода .I
относится к номерам строк полной таблицы данных. Однако, это не так , если нет 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
Выбор групп
# example data
DT = data.table(Titanic)
Предположим, что мы хотим видеть только второй класс:
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
Здесь мы просто подмножаем данные, используя i
, предложение «where».
Выбор групп по условию
# example data
DT = data.table(Titanic)
Предположим, мы хотим видеть каждый класс только в том случае, если большинство выжило:
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
Здесь мы возвращаем подмножество данных .SD
только в том случае, если наше условие выполнено. Альтернативой является
DT[, .SD[ sum(N[Survived=="Yes"]) > sum(N[Survived=="No"]) ) ], by=Class]
но это иногда оказалось медленнее.