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.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow