提高 table 相交的效率

Increasing efficiency of table intersect

我有2个tables.They都在染色体的形式,这条染色体上的开始和结束坐标。第一个 table 包含基因,第二个 table 包含可能属于也可能不属于这些基因的短序列。在我的真实数据集中,基因大约有 50.000 行,序列大约有 7.000.000 行,并且 table 都有各种额外的列。我想找到两个 table 之间的重叠部分。

chromosome=as.character(rep(c(1,2,3,4,5), each=10000))
start=floor(runif(50000, min=0, max=50000000))
end=start+floor(runif(10000, min=0, max=10000))
genes=cbind(chromosome, start, end)

startseq=floor(runif(7000000, min=0, max=50000000))
endseq=startseq+4
sequences=cbind(chromosome, startseq, endseq)

我正在尝试使用以下方法找到所有交叉点:

for (g in 1:nrow(sequences)) {
  seqrow=as.vector(sequences[g,])  
  rownr=which(genes[,1]==seqrow[1] & genes[,2] < seqrow[2] & genes[,3] > seqrow[3])
  print(rownr)
}

我打算使用这些行号对我的真实数据集中的额外列执行操作。目前的问题是所描述的过程相当缓慢。我可以通过哪些方式加快交叉速度?

您想使用 bioconductor for this task, and specifically the GenomicRanges 包。这将 return 一个 class "Hits" 的对象,它将包含重叠的索引。您也可以使用 intersect 函数,但是这个 returns 是相交的间隔而不是相交序列的 id。简而言之,bioconductor 和 GenomicRanges 有很多有用的设置函数,而且速度非常快。

## try http:// if https:// URLs are not supported
source("https://bioconductor.org/biocLite.R")
biocLite()
biocLite("GenomicRanges") ## I think genomicranges is part of the standard bioconductor install but if not this will install it.


library(GenomicRanges)

set.seed(8675309)
chromosome <- as.character(rep(c(1,2,3,4,5), each=10000))
start <- floor(runif(50000, min=0, max=50000000))
end <- start+floor(runif(10000, min=0, max=10000))
genes <- cbind(chromosome, start, end)

startseq <- floor(runif(7000000, min=0, max=50000000))
endseq <- startseq+4
chromosome <- sample(c(1,2,3,4,5), size = 7000000, replace=T)
sequences=cbind(chromosome, startseq, endseq)

genes <- GRanges(seqnames = chromosome, ranges = IRanges(start = start, end = end))
seqs <- GRanges(seqnames = chromosome, ranges = IRanges(start = startseq, end = endseq))

x <- findOverlaps(seqs, genes)
head(x)

#Hits object with 6 hits and 0 metadata columns:
#      queryHits subjectHits
#      <integer>   <integer>
#  [1]         2       41673
#  [2]         2       47476
#  [3]         3       20048
#  [4]         4        9624
#  [5]         4        5662
#  [6]         4        1531
#  -------
#  queryLength: 7000000
#  subjectLength: 50000