44

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]))ましたが、より良い解決策があることを願っています。このベクトルはテーブルの内部表現の一部である可能性があると思いますが、それにアクセスする方法はありますか? そうでない場合でも、あなたは何を提案しますか?

4

2 に答える 2

63

更新:からv1.8.3、あなたは単に作り付けのスペシャルを使うことができます.GRP

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

古い回答については、履歴を参照してください。

于 2012-10-22T20:44:59.583 に答える
13

への呼び出し内からはインデックス カウンターを使用できないと確信しているので、おそらくこれを行うだけです[.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)))]]
于 2012-10-22T20:20:19.900 に答える