1

何百もの列と行を持つリストがあります。私がやっていることは、2 つの列の差を取るほぼすべての可能な繰り返しをループすることです。たとえば、1 列目と 2 列目、1 列目と 3 列目、1 列目と 500 列目、499 列目と 500 列目の違いを考えてみましょう。これらの違いが得られたら、出力用の記述統計 (つまり、平均、標準偏差、尖度、歪度など) を計算します。lapply を使用して各列のこれらの統計を個別に計算できることはわかっていますが、sd(x)-sd(y) <> sd(xy) であるため、ループがあまり削減されません。avg(x)-avg(y)=avg(xy) を使用できますが、このプロパティを使用できる唯一の統計です。

ここに私が持っているいくつかの疑似コードがあります:

    for (n1 in 1:(number of columns) {
        for (n2 in n1:(number of columns) {
            temp<-bigdata[n1]-bigdata[n2]
                 results[abc]<-(maxdrawdown,mean,skewness,kurtosis,count,st dev,
                       median, downsidedeviation)
         }
         }

この方法で行うと、文字通り数日かかることがあるので、いくつかの改善を探しています。私はすでにCompilerを使用しenableJIT(3)ています。これにより、実際には著しく高速になります。私には他にもいくつかのアイデアがあり、どんな扇動も役に立ちます。1 つは Snowfall パッケージを利用しようとしており (まだ実装方法を理解しようとしています)、1 つのコアがスキューと尖度を計算し、もう 1 つのコアが他の統計を計算できると考えています。もう 1 つのアイデアは、temp の大きなチャンク (つまり、1-2、1-3、1-4) を別の data.frame (またはリスト) として作成し、それに対して lapply を使用して一度に多くの反復をノックアウトすることです。これは大きな違いを生むでしょうか?私が考えていないことで、他にできることはありますか?

4

2 に答える 2

1

問題を説明する方法がわかりにくいため、再現可能な例が本当に役立ちます(たとえば、リストには行/列がありません)。私の推測では、bigdataresultsは data.frames です。この場合、それぞれを行列に変換すると、ループがかなり高速になります。

于 2012-12-14T14:57:33.353 に答える
0

速くなるかどうかはわかりませんが、以下を実行すると、コードが少し速くなるはずですが、を削除したため、コードが少し速くなる可能性がありますfor() ...

を使用してみてくださいexpand.grid()。これは、おそらく使用頻度が少ない傾向があります。

例えば:

nC <- 3 # Num of cols
nR <- 4 # Num of cols
indices <- expand.grid(nC, nC)
# Now you can use apply cleanly
apply(indices, 1,
   function(x) {
      c1 <- x[1]; c2 <- x[2]
      yourResult[c1,c2] <- doYourThing(bigData[,c1], bigData[,c2])
   }
)

さて、あなたはアイデアを得る。:-)

于 2012-12-12T20:00:39.043 に答える