代码之家  ›  专栏  ›  技术社区  ›  bumblebee

data.table语法中的计算[已关闭]

  •  0
  • bumblebee  · 技术社区  · 6 年前

    我想执行自加入 data.table

    示例数据

    active <- data.table(id=c(1,1,1,2,2,3), no=c(1,2,3,1,2,1), beg=as.POSIXct(c("2018-01-01   01:10:00","2018-01-01 01:30:00","2018-01-01 01:50:00","2018-01-01 01:30:00","2018-01-01 01:50:00","2018-01-01 01:50:00")), end=as.POSIXct(c("2018-01-01 01:20:00","2018-01-01 01:40:00","2018-01-01 02:00:00","2018-01-01 01:40:00","2018-01-01 02:00:00","2018-01-01 02:00:00")))
    
    > active
       id no                 beg                 end
    1:  1  1 2018-01-01 01:10:00 2018-01-01 01:20:00
    2:  1  2 2018-01-01 01:30:00 2018-01-01 01:40:00
    3:  1  3 2018-01-01 01:50:00 2018-01-01 02:00:00
    4:  2  1 2018-01-01 01:30:00 2018-01-01 01:40:00
    5:  2  2 2018-01-01 01:50:00 2018-01-01 02:00:00
    6:  3  1 2018-01-01 01:50:00 2018-01-01 02:00:00
    

    > res
       id no                ibeg                iend
    1:  1  1 2018-01-01 01:20:00 2018-01-01 01:30:00
    2:  1  2 2018-01-01 01:40:00 2018-01-01 01:50:00
    3:  2  1 2018-01-01 01:40:00 2018-01-01 01:50:00
    

    但我的问题是关于语法中的计算的更一般的问题:执行时

    res <- active[active, .(id=x.id, ibeg=i.end, iend=x.beg), on=.(no=(no-1), id=id)]
    

    on=.(no=no-1) 但是获取一条错误消息 column [no-1] cannot be found no-1 但是没有用。是否禁止计算 on=

    1 回复  |  直到 6 年前
        1
  •  3
  •   dww Jarretinha    6 年前

    你可以用

    inactive  = active[, .(no=no[-.N], ibeg=end[-.N], iend=beg[-1]), by=id]
    
    #    id no                ibeg                iend
    # 1:  1  1 2018-01-01 01:20:00 2018-01-01 01:30:00
    # 2:  1  2 2018-01-01 01:40:00 2018-01-01 01:50:00
    # 3:  2  1 2018-01-01 01:40:00 2018-01-01 01:50:00