如何有效地获得重组载体?

时间:2016-12-02 14:12:13

标签: r vector

给定两个轴,两个轴的位置从1到N(N可以是几百万,但我们假设这里N = 1000), 有两个矢量分别记录两个轴上某些点的位置。例如:

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

如果在两个轴的位置300处重新组合,则两个轴上的300后面的点将切换到另一个轴。 记录点位置的两个向量将变为:

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

如果第二次重组发生在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

1 个答案:

答案 0 :(得分: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由于问题的大小需要大量内存,则可以改为使用循环。