我已经发布了this个问题,遗憾的是没有任何成功。与此同时,我发现了data.table
包并试图通过使用它提供的漂亮的“按引用更新”样式来补偿内存速度。我注意到data.table
有一个非常活泼和乐于助人的社区,所以我想知道这里是否有人可以帮助我。
我提出的另一个问题的链接更详细,在这里我只想知道在i
表达式中引用“即将发生的”值的方法,即我有一个带键的数据表 - 我想要根据j
- 表达式中另一列的当前行和后续行值的子集计算i
- 表达式中的新列,所有列都按键分组。
像这样:
data[TimeToGo %in% seq(TimeToGo-1,TimeToGo-7),
MinPrice := min(Price),
by = key(data)]
哪个基本上会遍历TimeToGo
的每个值(如TimeToGo[i]
),TimeToGo
中值为(TimeToGo[i]-1, TimeToGo[i]-7)
的数据表的子集,并取出{{1从此子集作为新列条目min(Price)
(在索引MinPrice
处)。
这样的尝试的结果给出了以下错误:
i
我尝试使用Error in seq.default(data$TimeToGo - 1, data$TimeToGo - 7 :
'from' must be of length 1
并且错误仍然存在。另一方面,使用by = .EACHI
- 循环的解决方案非常慢,所以我认为必须有更好的方法来实现这一点。
我非常感谢任何帮助,意见,方向,进一步阅读的参考......
提前致谢
d
答案 0 :(得分:2)
使用foverlaps
:
dt = data.table(time = c(1:4, 10:14), b = 1:9)
dt[, end := time] # necessary for the foverlaps atm
# time b end
#1: 1 1 1
#2: 2 2 2
#3: 3 3 3
#4: 4 4 4
#5: 10 5 10
#6: 11 6 11
#7: 12 7 12
#8: 13 8 13
#9: 14 9 14
intervals = dt[, .(start = time - 1, end = time + 7, idx = .I)]
setkey(intervals, start, end)
foverlaps(dt, intervals, by.x = c('time', 'end'))[, max(b), by = idx]
# idx V1
#1: 1 4
#2: 2 4
#3: 3 5
#4: 4 6
#5: 5 9
#6: 6 9
#7: 7 9
#8: 8 9
#9: 9 9