2012-05-07 15 views
1

最近、遺伝的プログラミングに使用する言語としてRを実験し始めました。私は徐々に、確かにRがどのように働いていて、その最良のコーディング方法についてますます学んできました。 しかし、私はロードブロックを襲った。ここに私の状況があります。私は約700行のデータセットを持っており、各行には400列程度のデータがあります。私は、列の数と同じ数のパラメータを持つ関数が、評価(フィットネススコアリング)関数にパラメータとして送信されるということをすべてセットアップしています。私は、データセットの行ごとに移動し、行の各列の値を評価対象の関数に渡したいと考えています。最初の問題は、パラメータを別々に関数に渡す方法を考え出すことでした。ファンクション、ベクター、ループin R

パラメータがあることカ月の変数(1-12)のベクトルである
do.call(function,as.list(parameters)) 

:「別に」私は機能は、私は次のように使用する400個のパラメータではなく、これを行うには長さ400のベクトルを期待していることを意味することにより、データセットの行の値に追加されます。これはうまくいきました。データセットの700行を反復するためにforループを使用した後、12ヶ月間別のループを使用して、上記の出力ベクトルを累積します。問題は、機能ごとに約24〜28秒の痛みを伴います。そして私は100-500の機能をこの評価に進化の世代ごとに送りました。結論はこれが道のりではないということです。次に、以下のようにsapplyメソッドを使用しようとしました。

これは、月として適用され(1-12)、データセットの行として適用されます(1-700)。これほど長い時間がかかりました。ソリューションのアイデアは参考になります。

+0

'plyr'パッケージから' ddply'関数を使うことを考えましたか? –

+2

'Rprof'を使って、コードのどの部分が最も遅いかを特定することができます。 –

+0

私はplyrを見ました。どのように実装されますか?私はベクトルのリストを持っています、各ベクトルはパラメータを含む行です。私は月変数と一緒に関数に各行を送る必要があります。 –

答えて

6

このような場合の主な問題はです。通常はです。あなたが取っているアプローチは間違っています。私はあなたの特定のケースについて十分に知らない:

  1. 計算をベクトル化してみます - ので、あなたの関数がにALL行を操作する必要があるだけではなく、一度に。
  2. 数値をdata.frameに格納するだけであれば、行列に変換すると通常は多くの処理が高速化されます。
  3. 400個のパラメータを持つ関数を記述しないでください!おそらくハイサイドにも5があります。

EDITあなたが関数を生成するので、あなたの代わりに、代わりにその多くのパラメータの値のベクトルをとり異なるバージョンを生成することができるはずです。あなたは合格ベクトルは、それは名前を持つことができることに注意してください:

# Convert this: 
f <- function(foo, bar) { 
    foo+bar 
} 
do.call(f, list(foo=42, bar=13)) 

# To this: 
f <- function(args) { 
    args[["foo"]] + args[["bar"]] 
    # or even faster: 
    #args[[0]] + args[[1]] 
    # or fastest: 
    #sum(args) 
} 
do.call(f, list(args=c(foo=42, bar=13))) 
# or, simply 
f(c(foo=42, bar=13)) 

...ではなく400の1つのパラメータを持つ関数を呼び出すとについて60倍高速です!しかし、これは単に関数を呼び出すオーバーヘッドに過ぎないことに注意してください。実際の関数がどれくらいの時間を要するかを測定する必要があります。それが2番目以上のものであれば、どれくらい効率的に呼び出すか、ループが効率的であるかどうかは関係ありません。

+0

@Isaac Drachmann:私はTommyに同意します。非常に一般的なヒントよりも多くの助けを得るために、コードについて詳しく教えてください。 – cbeleites

+1

Tommyのポイント2に追加:data.framesは、列に行列を保持できます。したがって、400種類のパラメータがすべて同じタイプでない場合でも、それらを少数のマトリックスにグループ化することができます。 「通常の」列を指定するのと同じように、式の列を参照することもできます。 – cbeleites