2016-12-02 8 views
1

1からNまでの位置(Nは数百万にもなるが、ここではN = 1000と仮定する)の場合、 2つの軸上のいくつかの点の位置をそれぞれ記録する2つのベクトルがある。例えば:組換えベクターを効率的に得るには?

chrm1 <- c(1, 35, 456, 732) # 4 points on axis 1 at position 1, 35, 456, 732; 
chrm2 <- c(23, 501, 980) 

組換えは、2つの軸の位置300で、2つの車軸上の300の背後に指している場合は、他の軸に切り替わります。ポイントの位置を記録 二つのベクトルはなります:

chrm1 <- c(1, 35, 501, 980) 
chrm2 <- c(23, 456, 732) 

第2の組換えが600で発生した場合、新しいベクトルは次のようになります。

chrm1 <- c(1, 35, 501, 732) 
chrm2 <- c(23, 456, 980) 

実際のデータは、次のようになります。

set.seed(1) 
chrm1 <- sample.int(1e8, 50) 
chrm2 <- sample.int(1e8, 50) 
breaks.site <- sample.int(1e8, 5) 

私の強引なやり方は、各ブレークサイトのポイントを他のベクトルに入れ替えることでした。しかし、これは2 x 1000 x 20000回行う必要があるため、これはかなり遅いです。 どのように再結合されたベクトルを効率的に得るには?

for(i in breaks.site){ 
    chrm1.new <- c(chrm1[chrm1 < i], chrm2[chrm2 > i]) 
    chrm2.new <- c(chrm1[chrm1 > i], chrm2[chrm2 < i]) 
    chrm1 <- chrm1.new 
    chrm2 <- chrm2.new 
} 

換えに関する背景: https://en.wikipedia.org/wiki/Genetic_recombination

+0

点の説明に長さの異なるベクトルがあるのはなぜですか? – Roland

+0

あなたのブルートフォースは何ですか? – alistaire

+0

@aichao、私は、短い例で論理を明確にし、各段階で何が起こるかと思います。 – mt1022

答えて

2

たぶん、この:あなたの問題の大きさに起因する多くのメモリへ

chrm1 <- c(1, 35, 456, 732) 
chrm2 <- c(23, 501, 980) 


breaks <- c(300, 600) 

#check all points for all breaks, 
#get sum of position changes and 
#calculate x mod 2 
changepos1 <- rowSums(outer(chrm1, breaks, ">")) %% 2 
changepos2 <- rowSums(outer(chrm2, breaks, ">")) %% 2 

#assemble results and sort 
res1 <- sort(c(chrm1[!changepos1], chrm2[as.logical(changepos2)])) 
#[1] 1 35 501 732 
res2 <- sort(c(chrm2[!changepos2], chrm1[as.logical(changepos1)])) 
#[1] 23 456 980 

outerもしニーズ、あなたの代わりにループを使用することができます。

+0

私は 'microbenchmark'パッケージで少しベンチマークを行いました。私の質問の長いサンプルデータに1000回適用すると、この方法は実際にはブルートフォースの方法(平均52ms)よりも遅い(平均116ms)。 – mt1022

+0

OK。ここではマイクロ秒を話していますよね?そして、あなたの最善の策はRcppで実装することです。これはこのアルゴリズムでは簡単です。 – Roland

+0

並べ替えが遅いです。私がそれを取り除いたとき、速度は似ています。私は大学のコースの後にCやC++に触れていません:(それは拾う時です。私はこの答えに投票します。 – mt1022

関連する問題