【发布时间】:2018-08-09 14:12:32
【问题描述】:
我有一个由 -1 和 1 组成的信号位置指示向量。另外,我有体积数据,我想根据 Signal 的值求和。基本数据表如下所示:
df <- cbind(Signal, Volume)
head(df, 20)
Signal Volume
2016-01-04 NA 37912403
2016-01-05 -1 23258238
2016-01-06 -1 25096183
2016-01-07 -1 45172906
2016-01-08 -1 35402298
2016-01-11 -1 29932385
2016-01-12 -1 28395390
2016-01-13 -1 33410553
2016-01-14 -1 48658623
2016-01-15 1 46132781
2016-01-19 1 30998256
2016-01-20 -1 59051429
2016-01-21 1 30518939
2016-01-22 1 30495387
2016-01-25 1 32482015
2016-01-26 -1 26877080
2016-01-27 -1 58699359
2016-01-28 1 107475327
2016-01-29 1 62739548
2016-02-01 1 46132726
我想要实现的是(不使用 for 循环)是产生一个 cum Volume 的向量,每次信号变化时都会重置它。此外,volume 的值应该乘以 Signal 的值,即当 Signal 为 -1 时,它应该将 -Volume 添加到当前的 cum Volume。 基于类似的问题,我尝试过
ave(df$a, cumsum(c(F, diff(sign(diff(df$a))) != 0)*df$Volume), FUN=seq_along)
产生正确的信号分组,但由于某种原因不包括音量。没有重置,解决方案相当简单(发布在 SO)
require(data.table)
DT <- data.table(dt)
DT[, Cum.Sum := cumsum(Volume), by=Signal]
有没有人知道用于重置和调节 cum sum 的 dplyr 或 data.table 类型的解决方案?谢谢。
【问题讨论】:
-
谢谢,但您的解决方案不会在 Signal 返回到过去的值后重置,即每次 Signal 更改时,Volume 都应重置为 0,而不是 cum 的最后一个值同一信号的音量。
-
该解决方案应该产生一个“锯齿状”函数,该函数在信号为 +1 或 -1 时增长(或下降),然后针对每个信号变化进行重置。
-
你可能想使用
data.table::rleid,就像df[, cum := cumsum(Volume), by= rleid(Signal)]一样
标签: r sum dplyr data.table conditional