2016-07-18 8 views
1

私はRの反復作業に慣れていません。私はウェブサイトで分析を実行しているので、プロセスをスピードアップしたいと考えています。Rの反復処理を高速化できますか?

私は行列を繰り返し、ある閾値(> 0.01)以上の基準データを選び、3つのベクトル、「source、target and corr」にこれらの値を最終的に浸透させる非常に有用なチュートリアルが見つかりましたうまく整理されたデータフレームを作成します。

source=c() 
target=c() 
corr<-c() 

g1<-rownames(adj_mat)[1:dim(adj_mat)[1]] 
g2<-g1 

for(gene in g1){ 
    for(gen in g2){ 
    if(adj_mat[gene,gen]>0.01){ 
     source<-c(source,gene) 
     target<-c(target,gen) 
     corr<-c(corr,adj_mat[gene,gen]) 
    } 
    } 
} 
network<-data.frame(source,target,corr) 

これは寸法1000年、500の小さな行列のための非常に良いですが、それは寸法10000のものとして、時間のイライラ量をとり、700 ...

マトリックスは、そのファイルから来ています私は「ソースなど」には合わないので、毎回ウェブサイトにアップロードして読むことになります。各新規にアップロードされたファイルが異なるサイズになるので、オブジェクトサイズをマトリックスのサイズに合わせる。

Rでこれを行うより効率的な方法があれば教えてください。

+0

変数「m」とは何ですか? (i in 1:nrow(adj_mat)))と@Paul Hiemstraが指摘したように、preallocateを使うことをお勧めします。例えば。:ソース< - 文字(長さ= nrow(adj_mat)) '。 – sebastianmm

+0

申し訳ありませんが、間違いを訂正しました –

答えて

2

今私が見ることのできる最大の問題は、いくつかのデータ構造、つまりsource,targetおよびcorrを繰り返し構築することです。あなたは、あなたのオブジェクトを正しいサイズにあらかじめ割り当てることによってコードをすばやくスピードアップし、インデックスを使って値を配置することができます。

操作をベクトル化することで、コードをさらに改善できます。 、これは単なるサンプルコードで

matching_indices = which(m > 0.01, arr.ind = TRUE) 
source = matching_indices[,1] 
target = matching_indices[,2] 
corr = m[m > 0.01] 

m[m > 0.01] 

し、データ構造sourcetargetcorrを得る:例えば、mの決定どの部分が0.01は簡単にこのように行うことができるよりも大きくなっていますこれがあなたが必要とするものなのかどうかは完全にはわかりません。しかしそれはそれに向けて良いステップを提供します。

+0

本当に便利だと思いますか?ありがとう –

+0

私は私の答えを拡大しました。適切な再現可能な例がなければ、それ以上のことは困難です。 –

+0

ああ、あなたはファイルの指定されたサイズにインデックスを合わせることによって申し訳ありません?はい、私はそれをすることはできませんので、いつも異なるサイズのウェブサイトにアップロードされたファイルから行列が来るでしょう –

2

実行者Rの作成にはベクトル化が非常に重要です。これにより、Rコードとネイティブコード間の値の転送を最小限に抑えてできるだけ多くの作業をネイティブコードで行うことができます。例えば

高速方法が一度+を呼び出しに対し遅い方法は、+ 3回、各反復のための1つを呼び出すため

# Slow 
a <- c(1, 2, 3) 
b <- c(4, 5, 6) 

r <- c() 

for (i in 1:length(a)) { 
    r <- c(r, a[i] + b[i]); 
} 

# Fast 
r <- a + b 

後者は、より高速です。可能な限り物事をバッチするようにしてください。それはまた、はるかに短いコードです!

しかし、条件はどうですか?あなたが最適化したいとします

# Slow 
a <- c(1, 2, 3) 
b <- c(4, 5, 6) 

r <- c() 

for (i in 1:length(a)) { 
    if (a[i] > b[i]/2) { 
     r <- c(r, a[i] + b[i]); 
    } else { 
     r <- c(r, a[i] - b[i]); 
    } 
} 

あなたはifelseを使用することができます。

# Fast 
a <- c(1, 2, 3) 
b <- c(4, 5, 6) 

r <- ifelse(a > b/2, a + b, a - b) 

あなたのコードに適用するためのPaulHiemstraの答え@を見てみましょう。