Data.table: Symbole .I cohérence en cas de non groupage

Créé le 30 janv. 2018  ·  5Commentaires  ·  Source: Rdatatable/data.table

Cela s'est produit avant j'en suis sûr, mais je ne trouve pas le problème ou le message SO. Quelqu'un se souvient ou a les liens s'il vous plaît? Il me semble me souvenir d'avoir répondu à quelqu'un quelque chose comme " .I est destiné à être utilisé dans le regroupement selon la documentation, mais il serait bon de l'étendre aussi au non-regroupement". La page de manuel contient toujours les mots "lors du regroupement" pour .I .

Comportement actuel à la fois dans v1.10.4-3 et dev:

> X = data.table(c("a","a","b","c","c"), 10:14)
> setkey(X,V1)
>  X["b"]
   V1 V2
1:  b 12       # ok
> X["b", .I]
[1] 1          # expected x's row number 3  (*1)
> X["b", .I, by=.EACHI]
   V1 I
1:  b 3        # ok
> X["b", .(.I,V2)]
   I V2
1: 1 12      # expected x's row number 3 not 1  (*2)
> X["b", .(.I,V2), by=.EACHI]
   V1 I V2
1:  b 3 12     # ok
> 

Maintenant, which=TRUE était prévu et fonctionne pour le premier cas (* 1):

> X["b", which=TRUE]
[1] 3

mais inclure les numéros de ligne de x dans j ( 2) n'est actuellement pas possible, sauf si vous ajoutez les numéros de ligne de x explicitement en tant que colonne. which=TRUE car je suppose que les gens atteignent .I abord.

bug consistency

Commentaire le plus utile

Désolé, je ne savais pas qu'il y avait un fil complet sur cette idée! Cela signifie que c'est une bonne idée, non?

Tous les 5 commentaires

Quelqu'un se souvient ou a les liens s'il vous plaît?

Peut-on utiliser .I pour le numéro de ligne global donc sans groupement, et .i pour le local donc uniquement à l'intérieur du groupement?

@dracodoc comme mentionné par Frank c'est # 1206

Désolé, je ne savais pas qu'il y avait un fil complet sur cette idée! Cela signifie que c'est une bonne idée, non?

exemple de https://github.com/Rdatatable/data.table/issues/539

dt <- data.table(a=sample(letters, 100, T), b=rnorm(100))
dt[ a=="c", list(.N, .I)]
   N .I
1: 4  1
2: 4  2
3: 4  3
4: 4  4

dt[a=="c", list(.N, .I), by=a]
   a N .I
1: c 4 54
2: c 4 67
3: c 4 71
4: c 4 86
Cette page vous a été utile?
0 / 5 - 0 notes