我有以下数据.桌子

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

WithinVAL个数字我想:

  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"内的行索引.

我试着用.I来处理whichlength:

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

但这不起作用,因为.I指的是一个有索引的向量,所以我想我们必须使用.I[].尽管在.I[]中,我再次面临这个问题,我没有行索引,而且我知道(通过阅读data.table常见问题解答和下面的帖子),如果可能的话,应该避免在行中循环.

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

R相关问答推荐

如何从其他前面列中减go 特定列的平均值?

跨列应用多个摘要函数:summerise_all:列表对象无法强制为double类型'

使用ggcorrplot在相关性矩阵上标注supertitle和index标签

如何从R中的字符串元素中减go 一个数字?

bslib::card_header中的shine::downloadButton,图标而不是文本

计算时间段的ECDF(R)

为什么当用osmdata映射R时会得到相邻状态?

如何调整曲线图中的y轴标签?

如何在所有绘图中保持条件值的 colored颜色 相同?

R函数,用于生成伪随机二进制序列,其中同一数字在一行中不出现超过两次

R:从geom_ol()中删除轮廓并导出为pdf

将Posict转换为数字时的负时间(以秒为单位)

使用Scale_*_MANUAL时在图例中保留未使用的系数级别

如何在科学记数法中显示因子

R如何计算现有行的总和以添加新的数据行

如何创建累加到现有列累计和的新列?

Rmarkdown::Render vs Source()

在生成打印的自定义函数中,可以通过变量将线型或 colored颜色 设置为NULL吗?

是否从列中删除★符号?

如何在访问之前下载的输入时同时上传和处理所有指定的shiny 输入?