2012-10-22 11 views
28

Dopo aver creato una chiave su data.table:data.table "indici chiave" o "contatore gruppo"

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 
#  x y 
# [1,] A B 
# [2,] A B 
# [3,] B B 
# [4,] B B 
# [5,] C A 
# [6,] C A 
# [7,] C A 
# [8,] C A 
# [9,] C C 
# [10,] C C 

mi vorrebbe ottenere un vettore intero che per ogni riga corrispondente "indice chiave" . Spero che i risultati attesi (colonna i) qui di seguito vi aiuterà a chiarire cosa intendo:

#  x y i 
# [1,] A B 1 
# [2,] A B 1 
# [3,] B B 2 
# [4,] B B 2 
# [5,] C A 3 
# [6,] C A 3 
# [7,] C A 3 
# [8,] C A 3 
# [9,] C C 4 
# [10,] C C 4 

Avevo pensato di usare qualcosa come cumsum(!duplicated(DT[, key(DT), with = FALSE])) ma spero ci sia una soluzione migliore. Sento che questo vettore potrebbe essere parte della rappresentazione interna del tavolo e forse c'è un modo per accedervi? Anche se non fosse così, cosa suggeriresti?

risposta

45

Aggiornamento: da v1.8.3, si può semplicemente utilizzare il integrato speciale .GRP:

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

Vedere la cronologia per le risposte precedenti.

+4

Penso che ".GRP" sia un'ottima idea e lo abbia desiderato in passato. Soluzione piacevole e apparentemente ottimale, a proposito. –

+2

@ JoshO'Brien Ok, '.GRP' ora in 1.8.3. –

+1

Come si trova la documentazione su queste e altre variabili come '.SDcols'? ??.. .GRP' ecc. –

12

probabilmente sarei solo fare questo, dal momento che io sono abbastanza fiducioso che nessun contatore indice è disponibile all'interno della chiamata a [.data.table():

ii <- unique(DT) 
ii[ , i := seq_len(nrow(ii))] 
DT[ii] 
#  x y i 
# 1: A B 1 
# 2: A B 1 
# 3: B B 2 
# 4: B B 2 
# 5: C A 3 
# 6: C A 3 
# 7: C A 3 
# 8: C A 3 
# 9: C C 4 
# 10: C C 4 

si potrebbe fare di questo un one-liner, a scapito di un ulteriore invito a unique.data.table():

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