2012-01-17 5 views
0

私はxtsオブジェクトに複数の株式記号の時系列を含んでいます。シンボル固有のサブグループにxtsオブジェクトを分割し、各シンボルのデータを処理し、元のxts行列のすべてのサブグループを再構成して、完全な行セットを含む必要があります。各シンボルは1〜4文字のフィールドで、サブグループ内のマトリックスを分割するための因子インデックスとして使用されます。なぜRのby()とlapply()のパフォーマンスの違いが大きいのですか?

これらはby()lapply()ddply()を呼び出すときに、私の行列を分割するために報告された時間です:データフレームと行列のサブグループでの作業に

> dim(ets) 
[1] 442750  24 
> head(ets) 
        Symbol DaySec ExchTm    LclTm    Open  High  Low  Close  CloseRet  
2011-07-22 09:35:00 "AA" "34500" "09:34:54.697.094" "09:34:54.697.052" " 158100" " 158400" " 157900" " 158200" " 6.325111e-04" 
2011-07-22 09:35:00 "AAPL" "34500" "09:34:59.681.827" "09:34:59.681.797" "3899200" "3899200" "3892200" "3894400" "-1.231022e-03" 
2011-07-22 09:35:00 "ABC" "34500" "09:34:49.805.994" "09:34:49.806.008" " 400100" " 401800" " 400100" " 401600" " 3.749063e-03" 
2011-07-22 09:35:00 "ALL" "34500" "09:34:59.009.001" "09:34:59.008.810" " 285500" " 285500" " 285300" " 285300" "-7.005254e-04" 
2011-07-22 09:35:00 "AMAT" "34500" "09:34:59.982.447" "09:34:59.982.423" " 130200" " 130500" " 130200" " 130500" " 2.304147e-03" 
2011-07-22 09:35:00 "AMZN" "34500" "09:34:48.012.576" "09:34:48.012.565" "2137400" "2139100" "2137400" "2139100" " 7.953588e-04" 
... (15 more columns) 
> system.time(by(ets, ets$Symbol, function(x) { return(x) })) 
    user system elapsed 
78.725 0.932 79.735 
> system.time(ddply(as.data.frame(ets), "Symbol", function(x) { return (x) })) 
    user system elapsed 
100.590 0.416 101.105 
> system.time(lapply(split.default(ets, ets$Symbol), function(x) { return(x) })) 
    user system elapsed 
    1.572 0.280 1.853 

詳しい情報はthis優れたブログの記事でご利用いただけます。

なぜlapply/split.defaultを使用するとパフォーマンスに大きな違いがありますか?数字モードでの作業

+0

がmyxts' 'の小さなサンプルを提供してください。私は 'by'を使わず、おそらく標準のxtsツールでやりたいことをする方法がありますが、再現可能な例がなければ分かりません。 –

+0

はい、 'head(myxts)'が大きすぎます。行 'X:Y'が' Symbol'の複数の値を含んでいる 'myxts [X:Y、1:5]'はどうでしょうか? 'summary'は文字に役立つ何を教えてくれるのでしょうか? –

+0

あなたは何をしようとしているのか分かりませんが、 'lapply(split.default(myxts、myxts $ Symbol)、str)'のようなものを呼び出してみてください。 –

答えて

0

は、処理時間を大幅に短縮:

> system.time(by(myxts[,c(1,2,3,4,5)], myxts$Symbol, summary)) 
    user system elapsed 
57.768 0.688 58.511 
> system.time(by(myxts[,c(1,2,3,4,5,6,7,8)], myxts$Symbol, summary)) 
    user system elapsed 
    62.284 0.620 62.971 
> system.time(by(myxts[,c(1,2,3,4,5,6,7,8, 9, 10, 11, 12)], myxts$Symbol, summary)) 
    user system elapsed 
76.529 0.632 77.232 
> myxts.numeric = myxts 
> mode(myxts.numeric) = "numeric" 
Warning message: 
In as.double.xts(c("AA", "AAPL", "ABC", "ALL", "AMAT", "AMZN", "BAC", : 
    NAs introduced by coercion 
> system.time(by(myxts.numeric[,c(1,2,3,4,5,6,7,8, 9, 10, 11, 12)], myxts$Symbol, summary)) 
    user system elapsed 
    4.948 0.688 5.642 
関連する問題