【问题标题】:data.table: How to indicate first occurrence of unique column value by groupdata.table:如何按组指示唯一列值的第一次出现
【发布时间】:2020-01-03 01:23:00
【问题描述】:

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

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 和 CLASS 滞后 1

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 变量吗?

【问题讨论】:

    标签: r data.table lag shift


    【解决方案1】:

    一种可能是:

    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
    

    【讨论】:

    • 看起来应该和 !duplicated(.SD, by=c("ID", "CLASS")) 一样工作,这可能比使用 by= 更快。
    • @Frank 有趣的可能性。您能否详细说明为什么它应该更快?
    • 当然。我在想这是对函数的一次调用,而不是按组调用;它是 data.table 包中的一个函数,所以我怀疑它很快
    猜你喜欢
    • 2016-03-04
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多