2012-10-22 55 views
28

創建一個data.table一個鍵後: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 
#  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 

我想獲得一個整數向量給每一行的相應的「關鍵指標」 。我希望低於預期的輸出(列i)將有助於澄清我的意思:

#  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 

我想過用類似cumsum(!duplicated(DT[, key(DT), with = FALSE]))但我希望有一個更好的解決方案。我覺得這個向量可能是表格內部表示的一部分,也許有辦法訪問它?即使情況並非如此,你會有什麼建議?

回答

45

更新:從v1.8.3,你可以簡單地使用內置的特殊.GRP

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

查看更舊答案的歷史記錄。

+4

我覺得'.GRP'是一個非常好的主意,過去一直希望它。順便說一下,看起來最好的解決方案,BTW。 –

+2

@ JoshO'Brien好了,'.GRP'現在在1.8.3中。 –

+1

如何找到關於'.SDcols'這些和其他變量的文檔? '.GRP'等 –

12

我可能只是這樣做,因爲我非常相信,沒有索引計數器可以從呼叫內[.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 

你能做出這樣一個班輪,犧牲額外調用unique.data.table()的:

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