提高 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
我有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