web-dev-qa-db-fra.com

Utilisation de .I pour renvoyer des numéros de ligne avec le package data.table

Quelqu'un pourrait-il m'expliquer l'utilisation correcte de .I pour avoir renvoyé les numéros de ligne d'une table de données?

J'ai des données comme celle-ci:

require(data.table)
DT <- data.table(X=c(5, 15, 20, 25, 30))
DT
#     X
# 1:  5
# 2: 15
# 3: 20
# 4: 25
# 5: 30

Je veux retourner un vecteur d'index de ligne où une condition dans i est TRUE, par exemple quelles lignes ont un X supérieur à 20.

DT[X > 20]
# rows 4 & 5 are greater than 20

Pour obtenir les indices, j'ai essayé:

DT[X > 20, .I]
# [1] 1 2 

... mais clairement je me trompe, car cela renvoie simplement un vecteur contenant 1 au nombre de lignes retournées. (Ce que je pensais être à peu près ce que .N était pour?).

Désolé si cela semble extrêmement basique, mais tout ce que j'ai pu trouver dans la documentation data.table est QUOI .I et .N faire, pas COMMENT les utiliser.

40
user3351605

Si tout ce que vous voulez, ce sont les numéros de ligne plutôt que les lignes elles-mêmes, utilisez which = TRUE, pas.I.

DT[X > 20, which = TRUE]
# [1] 4 5

De cette façon, vous bénéficiez des avantages de l'optimisation de i, par exemple des jointures rapides ou en utilisant un index automatique. Le which = TRUE le fait revenir tôt avec juste les numéros de ligne.

Voici l'entrée manuelle de l'argument which dans data.table:

TRUE renvoie les numéros de ligne de x auxquels i correspond. Si NA, renvoie les numéros de ligne de i qui n'ont aucune correspondance dans x. Par défaut FALSE et les lignes dans x qui correspondent sont retournées.


Explication:

Notez qu'il existe une relation spécifique entre .I et le i = .. argument dans DT[i = .., j = .., by = ..] À savoir, .I est un vecteur de numéros de ligne de la table sous-définie.

### Lets create some sample data
set.seed(1)
LL <- sample(LETTERS[1:5], 20, TRUE)
DT <- data.table(X=LL)

regardez la différence entre le sous-ensemble de la table entière et le sous-ensemble juste .I

DT[X == "B", .I]
# [1] 1 2 3 4 5 6

DT[  , .I[X == "B"] ]
# [1]  1  2  5 11 14 19
59
Ricardo Saporta

Désolé si cela semble extrêmement basique, mais tout ce que j'ai pu trouver dans la documentation data.table est CE QUE .I et .N font, pas COMMENT les utiliser.

Vérifions d'abord la documentation. J'ai tapé ?data.table Et recherché .I. Voici ce qu'il y a:

Avancé: Lors du regroupement , les symboles .SD, .BY, .N, .I et .GRP peuvent être utilisés dans l'expression j, définie comme suit.

.I est un vecteur entier égal à seq_len (nrow (x)). Lors du regroupement , il contient pour chaque élément du groupe son emplacement de ligne en x. Ceci est utile pour sous-ensemble dans j; par exemple. DT [ .I [quel.max (somecol)], par = grp].

Je souligne ici. L'intention initiale était d'utiliser .I Lors du regroupement. Notez qu'il y a en fait un exemple dans la documentation de COMMENT utiliser .I.

Vous ne regroupez pas.

Cela dit, ce que vous avez essayé était raisonnable. Au fil du temps, ces symboles sont devenus à utiliser lorsqu'ils ne sont pas également regroupés. Il peut arriver que .I Retourne ce que vous attendiez. Je peux voir que l'utilisation de .I Dans j avec à la fois i et by pourrait être utile. Actuellement, .I Ne semble pas utile lorsque i est présent, comme vous l'avez souligné.

L'utilisation de la fonction which() est bonne mais pourrait alors contourner l'optimisation dans i (which() a besoin d'une longue entrée logique qui doit être créée et transmise). L'utilisation de l'argument which=TRUE Est bonne mais alors juste renvoie les numéros de ligne (vous ne pouvez alors pas faire quelque chose avec ces numéros de ligne dans j par groupe).

Demande de fonctionnalité # 1494 déposée pour discuter de la modification de .I Pour qu'elle fonctionne comme vous l'espériez. La documentation contient les mots "son emplacement de ligne en x" qui impliqueraient ce que vous attendiez puisque x est l'ensemble data.table.

12
Matt Dowle

Alternativement,

 DataTable[ , which(X>10) ]

est probablement plus facile à comprendre et plus idiomatique R.

6
C8H10N4O2