2012-10-22 18 views
28

Po utworzeniu klucza na data.table:data.table „Kluczowe Wskaźniki” lub „przeciw” grupa

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 

Chciałbym dostać wektor dając całkowitą dla każdego wiersza odpowiadający „indeksu klucz” . Mam nadzieję, że oczekiwany wynik (kolumna i) poniżej pomogą wyjaśnić, co mam na myśli:

#  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 

Myślałem o użyciu coś podobnego cumsum(!duplicated(DT[, key(DT), with = FALSE])) ale jestem nadzieją, istnieje lepsze rozwiązanie. Czuję, że ten wektor może być częścią wewnętrznej reprezentacji tabeli i być może jest jakiś sposób, aby uzyskać do niego dostęp? Nawet jeśli tak nie jest, co byś zasugerował?

Odpowiedz

45

Update: od v1.8.3, można po prostu użyć wbudowany specjalny .GRP:

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

Zobacz historię starszych odpowiedzi.

+4

Myślę, że '.GRP' jest bardzo dobrym pomysłem i marzył o tym w przeszłości. Ładne i pozornie optymalne rozwiązanie, BTW. –

+2

@ JoshO'Brien Ok, '.GRP' teraz w wersji 1.8.3. –

+1

Jak znaleźć dokumentację na temat tych i innych zmiennych, takich jak '.SDcols'? ?? .GRP' itp. –

12

I pewnie właśnie to zrobić, ponieważ jestem przekonany, że nie dość licznik indeks jest dostępny z poziomu wezwania do [.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 

Można zrobić to jedno-liner, kosztem dodatkowego wezwania do unique.data.table():

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