根据R中data.table的当前行和后续行中的值计算新列

时间:2015-08-17 17:04:21

标签: r dataframe data.table subset

我已经发布了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

1 个答案:

答案 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