data.table
Sous-groupes de lignes
Recherche…
Remarques
Un rappel: la syntaxe DT[where, select|update|do, by]
est utilisée pour travailler avec des colonnes d'un data.table.
- La partie "where" est l'argument
i
- La partie "select | update | do" est l'argument
j
Ces deux arguments sont généralement passés par position plutôt que par nom.
Sélection des lignes dans chaque groupe
# example data
DT <- data.table(Titanic)
Supposons que, pour chaque sexe, nous voulons les rangées avec le plus grand nombre de survie:
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
est le sous-ensemble de données associé à chaque Sex
; et nous sommes en train de les attribuer aux lignes correspondant à notre condition. Si la vitesse est importante, utilisez plutôt une approche suggérée par eddi sur 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
Pièges
Dans la dernière ligne de code, .I
fait référence aux numéros de ligne de la totalité de data.table. Cependant, ce n'est pas vrai quand il n'y en a pas 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
Sélection de groupes
# example data
DT = data.table(Titanic)
Supposons que nous voulons seulement voir la deuxième classe:
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
Ici, nous sous-ensemble simplement les données en utilisant i
, la clause "where".
Sélection de groupes par condition
# example data
DT = data.table(Titanic)
Supposons que nous voulons voir chaque classe seulement si une majorité a survécu:
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
Ici, nous retournons le sous-ensemble de données .SD
uniquement si notre condition est remplie. Une alternative est
DT[, .SD[ sum(N[Survived=="Yes"]) > sum(N[Survived=="No"]) ) ], by=Class]
mais cela s'est parfois avéré plus lent.