【问题标题】:Count number of records and generate row number within each group in a data.table计算记录数并在 data.table 中的每个组内生成行号
【发布时间】:2013-11-21 01:24:07
【问题描述】:

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

最后我想要结果

    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”内的行索引。

我尝试使用.Iwhichlength 合作:

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

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

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

【问题讨论】:

    标签: r data.table


    【解决方案1】:

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

    【讨论】:

    • +1。而.N,.I等特殊符号记录在?`[.data.table`
    • @Frank 我似乎以一种过于复杂的方式附加了这个问题:)
    • 最好是seq_len(.N) 而不是1:.N
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-22
    相关资源
    最近更新 更多