2017-07-18 7 views
1

私は、データフレームの各行を2番目のマッピングデータフレームに格納された番号で分割しようとしています。早く行を繰り返し処理する方法

for(g in rownames(data_table)){ 
print(g) 
data_table[g,] <- data_table[g,]/mapping[g,2] 
} 

しかし、これは非常に遅く、各行の実行には約1〜2秒かかります。私は反復は、通常、Rで事を行うための最善の方法ではないことを知っていますが、それ以外の方法はわかりません。ランタイムをスピードアップできる方法はありますか?

+0

最初に、印刷物を取り除く。これによりさらに遅くなります – loki

+0

'apply'または' lapply'を試すことができます。あなたのケースでは、複数のデータフレームを持っているので 'mapply'を使いたいかもしれません – CPak

+3

彼らは同じ数の行を持っていますか?あなたはおそらく、列全体を一度に分割することができます。それらが正しく注文されている場合は –

答えて

1

これを試してみてください。ここで速度の点で

sweep(data_table, 1, mapping[[2]], "/") 

があなたのバージョンを含むirisデータセットを使用しての可能性とのベンチマークである:2つの変数が持っている場合

microbenchmark::microbenchmark(
A = { 
    for(g in rownames(test)){ 
     # print(g) 
      test[g,] <- test[g,]/test[g,2] 
     } 
    }, 
B = sweep(test, 1, test[[2]], "/"), 

C = test/test[[2]], 

times = 100 
) 

#Unit: microseconds 
#expr  min  lq  mean median   uq  max neval 
#A 82374.693 83722.023 101688.1254 84582.052 147280.057 157507.892 100 
#B 453.652 484.393 514.4094 513.850 539.480 623.688 100 
#C 404.506 423.794 456.0063 446.101 470.675 729.205 100 
+1

'iris'データセットは意味のあるパフォーマンスベンチマークにとっては小さすぎます –

1

あなたはこの操作をベクトル化することができます同じ行数:

dt <- data.frame(a = rnorm(100), b = rnorm(100)) 
mapping <- data.frame(x = rnorm(100), y = rnorm(100)) 

dt/mapping[,2] 
関連する問題