2012-10-22 2 views
28

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]))のようなものを使用して考えたが、よりよい解決策があると期待しています:私は期待出力(列i)は、以下の私が何を意味するかを明確に役立つことを願っています。私はこのベクトルがテーブルの内部表現の一部であると感じ、それにアクセスする方法があるかもしれません。そうでない場合でも、何をお勧めしますか?

答えて

45

を更新:

v1.8.3から、あなたは、単に作り付けの特別 .GRPを使用することができます unique.data.table()への追加の呼び出しの
DT[ , i := .GRP, by = key(DT)] 

古い回答の履歴を参照してください。

+4

私は '.GRP'はとても良いアイデアだと思っており、過去にそれを望んでいました。ニースと一見最適なソリューション、BTW。 –

+2

@ JoshO'Brien Ok、1.8.3に '.GRP'が追加されました。 –

+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 

をあなたが犠牲にして、このワンライナー作ることができます

DT[unique(DT)[ , i := seq_len(nrow(unique(DT)))]] 
関連する問題