R 使用data.table从起点和增量创建序列
我想使用data.table向起点重复添加增量R 使用data.table从起点和增量创建序列,r,data.table,sequence,cumulative-sum,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:
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
我可能知道如何在循环中执行此操作,但我想知道data.table是否也能处理此类问题
由于time
中的值是连续的,因此我的想法是使用inc
的累积值来索引,沿着
index <- dat[...,cumsum(...inc...),...]
dat[index]
索引#从查找下一次开始
dat[,next.time:=time+int][!dat,on=(next.time=time),next.time:=NA]
#在实际问题的循环中执行此操作,并在最后一列全部为NA时停止
dat[dat,on=(next.time=time),t1:=i.next.time]
dat[dat,on=(t1=时间),t2:=i.next.time]
dat
#时间int x下一次时间t1 t2
# 1: 2018-01-01 01:00:01 2 2 2018-01-01 01:00:03 2018-01-01 01:00:06
# 2: 2018-01-01 01:00:02 3 4 2018-01-01 01:00:05
# 3: 2018-01-01 01:00:03 3 6 2018-01-01 01:00:06
# 4: 2018-01-01 01:00:04 1 8 2018-01-01 01:00:05
# 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
您可能需要指定i
来对行进行子集设置。为了更好地理解问题,最好在帖子中展示你的方法。这与@bumblebee不一样吗?如果是重复的帖子,请删除其中一篇。发帖的时间都在一天之内,老帖子有更多关于计算的信息。是的,这是一样的,因为我觉得我有更好的方法来解释这个问题。有时我发现很难描述问题并用不同的描述发布它。然后我删除了旧的。@akrun我现在指定了我的方法,它认为I
部分正是我问题的关键。
index <- dat[...,cumsum(...inc...),...]
dat[index]
# 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>