统计每组中的logging数并生成行号

我有以下data.table

set.seed(1) DT <- data.table(VAL = sample(c(1, 2, 3), 10, replace = TRUE)) VAL 1: 1 2: 2 3: 2 4: 3 5: 1 6: 3 7: 3 8: 2 9: 2 10: 1 

VAL每个数字中,我想:

  1. 统计logging/行数
  2. 创build第一个,第二个,第三个出现的行索引(计数器)等。

最后我想要结果

  VAL COUNT IDX 1: 1 3 1 2: 2 4 1 3: 2 4 2 4: 3 3 1 5: 1 3 2 6: 3 3 2 7: 3 3 3 8: 2 4 3 9: 2 4 4 10: 1 3 3 

其中“COUNT”是每个“VAL”的logging/行数,“IDX”是每个“VAL”中的行索引。

我试着用whichlength来使用.I

  dt[, list(COUNT = length(VAL == VAL[.I]), IDX = which(which(VAL == VAL[.I]) == .I))] 

但是这不起作用.I指的是一个带有索引的向量,所以我想我必须使用.I[] 。 虽然里面.I[].I[]再次面临的问题,我没有行索引,我知道(从阅读data.table常见问题,并在这里的post后面)循环行应尽可能避免。

那么, data.table方式是什么?

使用.N

 DT[ , `:=`( COUNT = .N , IDX = 1:.N ) , by = VAL ] # VAL COUNT IDX # 1: 1 3 1 # 2: 2 4 1 # 3: 2 4 2 # 4: 3 3 1 # 5: 1 3 2 # 6: 3 3 2 # 7: 3 3 3 # 8: 2 4 3 # 9: 2 4 4 #10: 1 3 3 

.N是每个组中logging的数量,组由"VAL"定义。