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

I think you're going about this the right way. Using order instead of rank is a bit faster, but I don't see how this is "quite slow". Maybe you could elaborate a bit on your actual problem?

> 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

まず、完全で再現可能な例を送信していただきありがとうございます。

第二に、私はあなたの解決策が好きです。シンプルに保ちながら、はるかに高速にするのは難しいかもしれません。1つの解決策は、(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 に答える