R:多变量时间序列的滚动等级?

时间:2010-11-09 19:21:42

标签: r time-series zoo

我想每天对一组变量进行排名(从zoo系列开始)。

以下是一个例子:

set.seed(1)
x <- zoo(matrix(rnorm(9), nrow=3), as.Date("2010-01-01") + 0:2)
colnames(x) <- letters[1:3]

我知道这样做的唯一方法是rollapply,但这很慢。

>  rollapply(x, 1, rank, by.column=FALSE)
           a b c
2010-01-01 1 3 2
2010-01-02 1 2 3
2010-01-03 1 2 3

还有其他建议吗?

2 个答案:

答案 0 :(得分:2)

首先,感谢您发送完整且可重现的示例。

其次,我喜欢你的解决方案。你可能很难让它更快,但保持简单。一种解决方案是对底层矩阵(而不是zoo对象)进行jst工作:

> X <- coredata(x)
> t(apply(X, 1, rank))
     a b c
[1,] 1 3 2
[2,] 1 2 3
[3,] 1 2 3
> 

然后重新附加时间索引。这可能更快,但不一定更具防御性或更易于阅读。

答案 1 :(得分:2)

我认为你正确地采取了这种方式。使用order代替rank要快一点,但我不知道这是“非常慢”。也许你可以详细说明你的实际问题?

> system.time(for(i in 1:1000) rollapply(z, 1, order, by.column=FALSE))
   user  system elapsed 
      1       0       1 
> system.time(for(i in 1:1000) rollapply(z, 1, rank, by.column=FALSE))
   user  system elapsed 
   1.34    0.00    1.34