我有一些关于股票的时间序列数据。说每小时数据,1到100,以及每小时交易的股票量。我正在尝试创建第三个二进制变量来指示异常音量 - 定义为小时,音量比前24小时的平均值大10%。
stocks.df <- cbind(c(1:100), volume.vector)
我确信这可以通过一些粗糙的循环完成,但我敢打赌,dplyr(总是)有更好的解决方案。
if (stocks.df[i,volume] > mean(stocks.df[i-10:i,volume) unusualvol <- 1 else unusualvol <- 0
这是我最好的猜测,不包括10%的截止值。也许这在xts包中做得更好?
答案 0 :(得分:1)
您可以使用包rollapply()
中的函数zoo
,如下所示:
library(xts)
set.seed(42)
volume <- rlnorm(100) * 1000
ts <- xts(volume, order.by = Sys.Date() - 100:1)
tail(ts)
#> [,1]
#> 2018-01-05 329.2991
#> 2018-01-06 422.8268
#> 2018-01-07 322.4721
#> 2018-01-08 232.4189
#> 2018-01-09 1083.2682
#> 2018-01-10 1921.6887
tail(ts > 1.1 * lag(rollapply(ts, 10, mean), k = 1)
#> [,1]
#> 2018-01-05 FALSE
#> 2018-01-06 FALSE
#> 2018-01-07 FALSE
#> 2018-01-08 FALSE
#> 2018-01-09 FALSE
#> 2018-01-10 TRUE
对lag()
的调用可确保您将当前音量与之前十个数据点的平均值进行比较。