1

R の for ループは非常に遅いですが、次のことを実現する別の方法はわかりません。

このスクリーンショットに示すように:

出力形式を次のようにしたい:

> gene_id tss_id x y

その中で、x = isosub$q1_FPKM / iso.agg$q1_FPKM // (correspond gene_id)

y = isosub$q2_FPKM / iso.agg$q2_FPKM  

forループを使用した私のコードは次のとおりです。

length = length(isosub$gene_id)
tmp = data.frame(isosub$gene_id, isosub$q1_FPKM, isosub$q2_FPKM)
j = 1
denominator_q1 = iso.agg$q1_FPKM[j]
denominator_q2 = iso.agg$q2_FPKM[j]

gene_id = isosub$gene_id
tmpq1 = tmp$isosub.q1_FPKM
tmpq2 = tmp$isosub.q2_FPKM
isoq1 = iso.agg$q1_FPKM
isoq2 = iso.agg$q2_FPKM
o2_q1 = rep(0, length)
o2_q2 = rep(0, length)

i = 0

for (i in 1:length){
     if (gene_id[i+1] == gene_id[i]){
          o2_q1[i] = tmpq1[i] / denominator_q1
          o2_q2[i] = tmpq2[i] / denominator_q2
     }else{
          o2_q1[i] = tmpq1[i] / denominator_q1
          o2_q2[i] = tmpq2[i] / denominator_q2
          j = j + 1
          denominator_q1 = isoq1[j]
          denominator_q2 = isoq2[j]
     }
}

whenlength = 1000は、次のsystem.timeことを示しています。

>    user  system elapsed 
>   55.74    0.00   56.45

そして、私の実際の長さはさらに大きく、13751 です。

4

2 に答える 2

1

ループを回避または高速化する方法を探してここにたどり着いた場合は、次の回答を確認してください: R でループ操作を高速化する

私が抱えていた同様の問題を解決し、必要なループを維持しながらパフォーマンスを劇的に向上させる方法を示しています。

于 2014-01-29T00:42:15.960 に答える