计算记录数并在data.table中生成每个组内的行号

时间:2013-11-08 21:50:39

标签: r data.table

我有以下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. 计算记录/行数
  2. 创建第一次,第二次,第三次出现的行索引(计数器)。
  3. 最后我想要结果

        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”的记录/行数,“IDX”是每个“VAL”中的行索引。

    我尝试使用whichlength.I合作:

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

    但这不起作用,因为.I指的是带索引的向量,所以我想必须使用.I[]。虽然在.I[]里面我再次遇到问题,但我没有行索引,而且我知道(从阅读data.table常见问题解答并在此处发布帖子),如果可能的话,应该避免循环遍历行。

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

1 个答案:

答案 0 :(得分:87)

使用.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是每个组中的记录数,其中的组由"VAL"定义。