2012-10-22 19 views
28

bir data.table bir anahtar oluşturma sonra "grubu sayacı":data.table "tuşuna endeksleri" veya

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 

Bir tam sayı vektör, her satır uygun "anahtar indeksi" için veren istiyorum .

#  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 

Ben cumsum(!duplicated(DT[, key(DT), with = FALSE])) gibi bir şey kullanma hakkında düşündüm ama daha iyi bir çözüm yoktur umuyorum: Beklediğim çıkışı (kolon i) altına ne demek netleştirmenize yardımcı olur. Bu vektörün masanın içsel temsilinin bir parçası olabileceğini hissediyorum ve belki de ona erişmenin bir yolu var mı? Durum böyle olmasa bile, ne önerirsiniz?

cevap

45

Güncelleme: v1.8.3 itibaren, basitçe dahili özel kullanabilirsiniz .GRP:

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

Eski cevaplar için geçmişe bakın.

+4

Sanırım .GRP' çok iyi bir fikir ve geçmişte bunu diledi. Güzel ve görünüşte en uygun çözüm, BTW. –

+2

@ JoshO'Brien Ok, “.GRP” şimdi 1.8.3'te. –

+1

Biri bunlarla ve '.SDcols' gibi diğer değişkenlerle ilgili belgeleri nasıl bulabilir? ".GRP" vb. –

12

Ben [.data.table() hiçbir indeks karşı görüşmesinin içinden kullanılabilir olduğunu oldukça eminim çünkü ben muhtemelen sadece bu yapardım:

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 

Bunun bir tek satırlık yapabilir pahasına, unique.data.table() için ek bir çağrının:

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