data.table“关键指数”或“组计数器”

时间:2012-10-22 19:48:16

标签: r 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]))这样的东西,但我希望有更好的解决方案。我觉得这个向量可能是表格内部表示的一部分,也许有一种方法可以访问它?即使不是这样,你会建议什么?

2 个答案:

答案 0 :(得分:51)

更新:从v1.8.3开始,您只需使用内置的特殊.GRP

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

查看旧答案的历史记录。

答案 1 :(得分: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)))]]