我想每天对一组变量进行排名(从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
还有其他建议吗?
答案 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