【发布时间】:2016-01-14 21:57:50
【问题描述】:
我有一个如下所示的数据表,我想汇总另一个时间戳向量的 5s 时间范围内的所有值。
如果我的描述让你感到困惑,请看下面的玩具示例
trade_hist <-data.table(timestamp=seq(1,200,2),value=rep(1:5,20))
TS <- seq(2,200,2)
> head(trade_hist)
timestamp value
1: 1 1
2: 3 2
3: 5 3
4: 7 4
5: 9 5
6: 11 1
> head(TS)
[1] 2 4 6 8 10 12
我最终想像在 TS 中一样创建带有时间戳的新表,并在特定条件下聚合原始表中的值(比如在该时间戳之前的 5 秒时间范围内总结所有值)。我可以使用以下代码完成此操作:
list_of_values <- vector("list",length(TS))
for(i in 1:length(TS)){
ts <- TS[i]
tmp <- trade_hist[(ts-timestamp <= 5) & ts-timestamp > 0]
tmp <- tmp[,.(sumVal=sum(value))]
list_of_values[[i]] <- tmp
}
newcol <- rbindlist(list_of_values)
result_wanted <- cbind(TS,newcol)
> head(result_wanted)
TS sumVal
1: 2 1
2: 4 3
3: 6 6
4: 8 9
5: 10 12
6: 12 10
例如,当TS=6时,回溯原表5s范围之前,我们有value=1,2,3,因此总和为6;当 TS=8 时,回看原来的表我们有 value=2,3,4,sum 为 9。
但是上面的代码对于更大的表来说效率极低,还有其他方法吗?谢谢!
【问题讨论】:
-
这不是很可重现。
-
请使用
dput编辑您的数据。不过,一般来说,这些操作看起来是可矢量化的;只需在没有循环的情况下运行相同的东西。 -
你会让你的例子更小并显示你想要的输出吗?
-
@DavidArenburg 描述已编辑。请帮忙!
-
@alistaire 如果你能提供一个矢量化的例子,那就太好了。谢谢!
标签: r data.table