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
我有一个很大的 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