给定两个轴,两个轴的位置从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
答案 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
由于问题的大小需要大量内存,则可以改为使用循环。