flo*_*del 40 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
Run Code Online (Sandbox Code Playgroud)
我想得到一个整数向量,为每一行提供相应的"密钥索引".我希望下面的预期输出(列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
Run Code Online (Sandbox Code Playgroud)
我想过使用类似的东西,cumsum(!duplicated(DT[, key(DT), with = FALSE]))但我希望有更好的解决方案.我觉得这个向量可能是表格内部表示的一部分,也许有一种方法可以访问它?即使不是这样,你会建议什么?
Mat*_*wle 55
更新:从v1.8.3,你可以简单地使用内置的特殊.GRP:
DT[ , i := .GRP, by = key(DT)]
Run Code Online (Sandbox Code Playgroud)
查看旧答案的历史记录.
Jos*_*ien 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
Run Code Online (Sandbox Code Playgroud)
你可以把它作为一个单行程,但要额外调用unique.data.table():
DT[unique(DT)[ , i := seq_len(nrow(unique(DT)))]]
Run Code Online (Sandbox Code Playgroud)