data.table:如何按组指示唯一列值的第一次出现

data.table: How to indicate first occurrence of unique column value by group

我有一个很大的 data.table ~ 18*10^6 行,其中填充了列 ID 和 CLASS,我想创建一个新的二进制列来指示出现新的 CLASS 按 ID 计算值。

DT <- data.table::data.table(ID=c("1","1","1","2","2"),
                             CLASS=c("a","a","b","c","b"))
### Starting
ID CLASS
 1     a
 1     a
 1     b
 2     c
 2     b

### Desired
ID CLASS NEWCLS
 1     a      1
 1     a      0
 1     b      1
 2     c      1
 2     b      1

我最初初始化了 NEWCLS 变量并使用 data.table::shift() 函数通过 ID 滞后 1 和 CLASS

DT[,NEWCLS:=0]

DT[,NEWCLS:=data.table::shift(NEWCLS, n = 1L, fill = 1, type = "lag"),by=.(ID,CLASS)]

这会创建所需的输出,但是对于 ~18*10^6 行需要相当长的时间,即使对于 data.table。

有人知道如何仅使用 data.table 个参数以更快、更有效的方式创建 NEWCLS 变量吗?

一种可能是:

DT[, NEWCLS := as.integer(!duplicated(CLASS)), by = ID]

   ID CLASS NEWCLS
1:  1     a      1
2:  1     a      0
3:  1     b      1
4:  2     c      1
5:  2     b      1