data.table语法中的计算

时间:2018-11-30 14:08:33

标签: r data.table

我想在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 个答案:

答案 0 :(得分:3)

您可以使用

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