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]))
のようなものを使用することを考えましたが、より良い解決策があることを望んでいます。このベクトルはテーブルの内部表現の一部である可能性があると思いますが、それにアクセスする方法はあるのでしょうか?そうでない場合でも、何を提案しますか?
更新:v1.8.3
から、組み込みの特別な.GRP
を使用できます。
DT[ , i := .GRP, by = key(DT)]
古い回答については、履歴を参照してください。
[.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()
への追加の呼び出しを犠牲にして、これを1行にすることができます。
_DT[unique(DT)[ , i := seq_len(nrow(unique(DT)))]]
_