2012-01-21 18 views
2

私は現在、doByパッケージのsummaryByコマンドを使用して、特定の機能によってデータフレームの行をグループ化しています。これは正常に動作します。 BUT:より速いdoBy/summaryByへの代替

doByパッケージのロードが非常に遅く、さまざまな他のパッケージをインポートすると思います。 doByがロードされるまで約3秒かかります。私はこのパッケージのシンプルなsummaryBy機能が必要です。

パッケージの読み込み時間を短縮する可能性はありますか、それともこのような巨大なパッケージをロードしない別の実装がありますか?

+0

この質問は、移行されたもう1つのSOにも属しています。これにも統計的な内容はありません。 –

答えて

15

複雑な機能を持つ大きなデータセットを集約するには、data.tableパッケージを倒すのは難しいです。たとえば、ここにあなたがアイリスデータセットのmeanSepal.Lengthsdを要約します方法は次のとおりです。

require(data.table) 
dat <- data.table(iris) 
dat[,list(mean=mean(Sepal.Length), sd=sd(Sepal.Length)),by=Species] 

ライブラリのロード早く、それだけで、コードの1行(あなたのdata.framedata.tableに変換するIFカウント2)を取り、非常に速いです。何がもっと欲しい?

6

あなたが望む機能をベースにしたR-lapply(split(.))のパラダイムを使うだけで、より高速なパフォーマンスを得ることができます。

dat <- structure(list(category = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("A", 
"B", "C"), class = "factor"), year = c(2000, 2001, 2004, 2005, 
2009, 2010, 2000, 2001, 2004, 2005, 2009, 2010, 2000, 2001, 2004, 
2005, 2009, 2010), incidents = c(7, 4, 4, 2, 3, 1, 6, 3, 5, 2, 
2, 5, 2, 1, 4, 4, 2, 1)), .Names = c("category", "year", "incidents" 
), row.names = c(NA, -18L), class = "data.frame") 

split(dat, dat$category) 
lapply(split(dat[-1], dat$category), summary) 
+0

'lapply(split(。)) 'パラダイムの高速パフォーマンス?シャダー。 –

+0

はい。私はあなたの娯楽マシューを見ることができます。私はちょうどそれがdoByと比較してもっと速いかもしれないと考えていた。 –

3

1)よりもむしろdoByパッケージをインストールし、doByソースパッケージからsummaryBy.RorderBy.Rを調達してみてください。

setwd("doBy/R") 
source("summaryBy.R") 
source("orderBy.R") 

summaryBy(...whatever...) 

または

2)の説明を除いて、パッケージ内のすべてのファイルを削除Rディレクトリとその2つのソースファイル(他のすべての.Rファイルを削除)を削除し、Descends:行とImports:行をDESCRIPTIONファイルから削除します(必要に応じて、DESCRIPTION内のPackage:行を別の名前に変更します)。 tをインストールする彼は新しいパッケージを取り除いた。 (もう一つの可能​​性は、パッケージ内のすべてのファイルを残して、Descends:とImports:行をDESCRIPTIONファイルから削除するだけですが、ほとんどすべてを削除するほど速くロードされません)。

関連する問題