使用data.table从起点和增量创建序列

时间:2018-12-14 09:47:55

标签: r data.table sequence cumulative-sum

我想使用data.table重复增加一个增量到起点。

library(data.table)
dat <- data.table(time=seq(from=as.POSIXct("2018-01-01 01:00:01"),to=as.POSIXct("2018-01-01 01:00:10"), by="secs"), int=c(2,3,3,1,10,10,10,10,10,10), x=2*1:10)

> dat
                  time inc  x
 1: 2018-01-01 01:00:01   2  2
 2: 2018-01-01 01:00:02   3  4
 3: 2018-01-01 01:00:03   3  6
 4: 2018-01-01 01:00:04   1  8
 5: 2018-01-01 01:00:05  10 10
 6: 2018-01-01 01:00:06  10 12
 7: 2018-01-01 01:00:07  10 14
 8: 2018-01-01 01:00:08  10 16
 9: 2018-01-01 01:00:09  10 18
10: 2018-01-01 01:00:10  10 20

也就是说,从第1行开始,我想将inc的值添加到time,产生一个新的时间。然后,我需要在该新时间添加inc的值,以第三次到达。结果将是

> res
                  time inc  x
1: 2018-01-01 01:00:00   2  2
2: 2018-01-01 01:00:02   3  6
3: 2018-01-01 01:00:05  10 12

我可能会知道如何循环执行此操作,但是我想知道data.table是否也可以处理这些类型的问题。

由于time中的值是连续的,所以我的想法是使用inc的累积值沿线

进行索引
index <- dat[...,cumsum(...inc...),...]
dat[index]

但是我无法让cumsum()忽略兴趣点之间的值。也许可以在data.table的i部分中完成此操作,但我不知道如何做。有人知道吗?

1 个答案:

答案 0 :(得分:0)

# start with finding the next time
dat[, next.time := time + int][!dat, on = .(next.time = time), next.time := NA]

# do this in a loop for the actual problem, and stop when final column is all NA
dat[dat, on = .(next.time = time), t1 := i.next.time]
dat[dat, on = .(t1 = time), t2 := i.next.time]

dat
#                   time int  x           next.time                  t1   t2
# 1: 2018-01-01 01:00:01   2  2 2018-01-01 01:00:03 2018-01-01 01:00:06 <NA>
# 2: 2018-01-01 01:00:02   3  4 2018-01-01 01:00:05                <NA> <NA>
# 3: 2018-01-01 01:00:03   3  6 2018-01-01 01:00:06                <NA> <NA>
# 4: 2018-01-01 01:00:04   1  8 2018-01-01 01:00:05                <NA> <NA>
# 5: 2018-01-01 01:00:05  10 10                <NA>                <NA> <NA>
# 6: 2018-01-01 01:00:06  10 12                <NA>                <NA> <NA>
# 7: 2018-01-01 01:00:07  10 14                <NA>                <NA> <NA>
# 8: 2018-01-01 01:00:08  10 16                <NA>                <NA> <NA>
# 9: 2018-01-01 01:00:09  10 18                <NA>                <NA> <NA>
#10: 2018-01-01 01:00:10  10 20                <NA>                <NA> <NA>