2012-01-06 27 views
3

1000個以上の行を持つデータセットに適用すると、Rにチョーク機能があります。したがって、私は自分のデータセットをn個のチャンクのリストに分割したい。各チャンクは1000行以下である。私はそれが速く、大規模なデータセットで実行されるように、この機能をより効率的にしたいと思いデータセットをチャンクに分割する

chunkData <- function(Data,chunkSize){ 
    Chunks <- floor(0:(nrow(Data)-1)/(chunkSize)) 
    lapply(unique(Chunks),function(x) Data[Chunks==x,]) 
} 
chunkData(iris,100) 

は、ここで私は現在、チャンキングを行うために使用している機能です。

+1

... data.framesの代わりに行列を使用することができ、なぜ1000個の以上の行を持つオブジェクトの上にチョーク機能を固定していませんか? –

+0

はい、確かに!メモリ管理や、データをどのように整理するかについて学ぶ必要があるかもしれません。また、「チョーク」を定義します。退屈する前に1000rows(*いくつの列?)が終了したからといって、10^5行の正味の処理時間が改善されるわけではありません。 –

+0

@CarlWitthoftとJosh:提案に感謝します。私はすでに関数をかなり最適化していますが、メモリを吸うデータ変換がたくさんあり、避けることはできないと思います。私は実際にそれを吸い上げて、この関数を行ごとに 'apply 'することにしました。これは長い時間がかかりますが、メモリ不足はありません。 – Zach

答えて

7

あなたは簡単に行により、3つのデータ・フレームのリストにirisデータセットを分割します、split(iris, 1:3)、例えばR. baseからsplitを使用してこれを行うことができます。引数を変更してチャンクサイズを指定することができます。

出力はまだデータフレームのリストなので、出力にlapplyを簡単に使用してデータを処理し、必要に応じて組み合わせることができます。

速度は、このアプローチを使用する主な問題であるので、私はあなたが大規模なデータセットで素晴らしい作品data.tableパッケージ、見てみることをお勧めします。あなたがあなたの機能で達成しようとしていることについてより多くの情報を指定すると、SOの人々が助けになるかもしれません。

+0

私は前に分割機能について聞いたことがありません。私の問題がベースRで非常にエレガントに解決されていることを知ってうれしいです! – Zach

+0

はい。 'base'Rにいくつかの隠された宝石があります。 – Ramnath

3

split()を呼び出してlapply()呼び出しに置き換え:また、このパッケージは、分割適用コンバイン原則を中心に構築され、plyrパッケージddply FOMを見てみる必要があります

split(Data, Chunks) 
2

を。 This paper about the packageは、これがどのように動作し、plyrで何が利用できるのかを説明しています。

私がここで取る一般的な戦略は、chunkidというデータセットに新しいデータを追加することです。これにより、1000行のチャンクでデータがカットされ、rep関数を参照してこの行を作成します。その後、行うことができます:私はその明確な構文や構造、および並列処理の支援のためのplyrが好き

result = ddply(dat, .(chunkid), functionToPerform) 

。すでに述べたように、data.tableもご覧ください。some situationsの方がかなり速いかもしれません。

追加の先端が

関連する問題