59

我有以下数据表

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. 创建第一次、第二次、第三次出现等的行索引(计数器)。

最后我想要结果

    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办法呢?

4

1 回答 1

97

使用.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"

于 2013-11-08T21:53:45.097 回答