data.table
Rijen per groep instellen
Zoeken…
Opmerkingen
Een herinnering: DT[where, select|update|do, by]
syntaxis wordt gebruikt om te werken met kolommen van een data.table.
- Het "waar" gedeelte is het
i
argument - Het gedeelte "select | update | do" is het argument
j
Deze twee argumenten worden meestal op positie doorgegeven in plaats van op naam.
Rijen selecteren binnen elke groep
# example data
DT <- data.table(Titanic)
Stel dat we voor elk geslacht de rijen met de hoogste overlevingscijfers willen:
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
is de subset van gegevens die aan elk Sex
gekoppeld; en we zetten dit verder in op de rijen die aan onze voorwaarde voldoen. Als snelheid belangrijk is, gebruik dan in plaats daarvan een door eddi voorgestelde aanpak op 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
valkuilen
In de laatste coderegel verwijst .I
naar de rijnummers van de volledige data.table. Dit is echter niet waar als er geen 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
Groepen selecteren
# example data
DT = data.table(Titanic)
Stel dat we alleen de tweede klas willen zien:
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
Hier stellen we de gegevens eenvoudigweg in met i
, de "where" -clausule.
Groepen selecteren op voorwaarde
# example data
DT = data.table(Titanic)
Stel dat we elke klasse alleen willen zien als een meerderheid overleefde:
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
Hier retourneren we de subset van gegevens .SD
alleen als aan onze voorwaarde is voldaan. Een alternatief is
DT[, .SD[ sum(N[Survived=="Yes"]) > sum(N[Survived=="No"]) ) ], by=Class]
maar dit is soms langzamer gebleken.