4

我想每天对一组变量进行排名(从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

还有其他建议吗?

4

2 回答 2

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 
于 2010-11-09T19:47:57.130 回答
2

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

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

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

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

于 2010-11-09T19:39:06.557 回答