data.table “índices clave” o “contador de grupos”

Después de crear una clave en un data.table:

set.seed(12345) DT <- data.table(x = sample(LETTERS[1:3], 10, replace = TRUE), y = sample(LETTERS[1:3], 10, replace = TRUE)) setkey(DT, x, y) DT # xy # [1,] AB # [2,] AB # [3,] BB # [4,] BB # [5,] CA # [6,] CA # [7,] CA # [8,] CA # [9,] CC # [10,] CC 

Me gustaría obtener un vector entero que proporcione para cada fila el “índice clave” correspondiente. Espero que el resultado esperado (columna i ) a continuación ayude a aclarar lo que quiero decir:

 # xyi # [1,] AB 1 # [2,] AB 1 # [3,] BB 2 # [4,] BB 2 # [5,] CA 3 # [6,] CA 3 # [7,] CA 3 # [8,] CA 3 # [9,] CC 4 # [10,] CC 4 

Pensé en usar algo como cumsum(!duplicated(DT[, key(DT), with = FALSE])) pero espero que haya una mejor solución. Siento que este vector podría ser parte de la representación interna de la tabla, y tal vez haya una forma de acceder a él. Incluso si no es el caso, ¿qué sugieres?

Actualización: desde v1.8.3 , puede simplemente usar el .GRP especial incorporado:

 DT[ , i := .GRP, by = key(DT)] 

Ver el historial de respuestas antiguas.

Probablemente solo haga esto, ya que estoy bastante seguro de que no hay un contador de índice disponible dentro de la llamada a [.data.table() :

 ii <- unique(DT) ii[ , i := seq_len(nrow(ii))] DT[ii] # xyi # 1: AB 1 # 2: AB 1 # 3: BB 2 # 4: BB 2 # 5: CA 3 # 6: CA 3 # 7: CA 3 # 8: CA 3 # 9: CC 4 # 10: CC 4 

Puede hacer que esto sea de una sola línea, a expensas de una llamada adicional a unique.data.table() :

 DT[unique(DT)[ , i := seq_len(nrow(unique(DT)))]]