所以,我对R很新,我有一个运行时问题。我使用“Biostrings”包(biocLite)编写了以下嵌套的while循环,以便连接来自两个物种的蛋白质序列,如果它们具有> 90%的比对分数。
基本上,我输入两个蛋白质基因组,将SeqData1中的每个氨基酸序列与SeqData2中的每个氨基酸序列进行比较,计算比对分数,如果分数> 90%,我会连接一个匹配的蛋白质名称列表和SeqData2蛋白的序列。
该功能确实可以正常工作,唯一的问题是它必须扫描的蛋白质数量我预测整个运行时间大约是1.4个月。 Ť
有没有人对如何以指数方式加速此功能的运行时有任何建议?
谢谢!
R代码:
SeqScore <- function()
{
source("http://bioconductor.org/biocLite.R")
biocLite()
require("Biostrings")
data(BLOSUM100)
SeqData1 <- readDNAStringSet("SeqData1.fasta")
proNum1 = 84390 # number of proteins in Seq1
SeqData2 <- readDNAStringSet("SeqData2.fasta")
proNum2 = 15194 # number of proteins in Seq
#Create empty list to fill with percent scores and matching sequences:
DList=NULL
QueSeqList = NULL
TotList = NULL
#initiating the counters:
i=1
j=1
c=0
#Perform alignment and generate percent identity scores:
while(i<=proNum1)
{
while(j<=proNum2)
{
SeqAlign <- pairwiseAlignment(SeqData1[i], SeqData2[j], substitutionMatrix=BLOSUM100, gapOpening=0, gapExtension=-5)
PercAlign <- pid(SeqAlign)
if(PercAlign>=90)
{
DList = c(DList, names(SeqData1[i]), names(SeqData2[j]))
QueSeqList = c(QueSeqList, toString(SeqData2[j]))
c=c+1
}
else{c=c+1; print(c)}
j=j+1
}
i=i+1
j=1 #to reset the inner while loop
}
unlist<-t(sapply(DList, unlist));
outputMatrix<-cbind(DList,QueSeqList)
outputMatrix<-as.matrix(outputMatrix, ncol=3)
write.csv(outputMatrix, "outputMatrix.csv")
}
答案 0 :(得分:1)
在帮助页面中,我认为pairwiseAlignment
在第一个参数为任意长度的DNAStringSet
时有效,因此外部循环可以替换为
SeqAlign <- pairwiseAlignment(SeqData1, SeqData2[j],
substitutionMatrix=BLOSUM100, gapOpening=0, gapExtension=-5)
我不会使用while
循环,而是针对lapply
,而不是
results <- lapply(SeqData2, function(elt_j) {
SeqAlign <- pairwiseAlignment(SeqData1, elt_j,
substitutionMatrix=BLOSUM100, gapOpening=0, gapExtension=-5)
pid(SeqAlign)
})
data.frame(toString(SeqData1), rep(toString(SeqData2), each=length(SeqData1)),
unlist(pid, use.names=FALSE))
这可以使您远离R inferno的第二个圆圈,并且如果计算速度仍然很慢,还建议在非Windows上并行化这个简单的策略:
library(parallel)
options(mc.cores=detectCores())
results <- mclapply(seq_along(... ## as before
最好询问有关它长度的数据,而不是单独列出proNum1 = length(SeqData1)
。另外,我希望你每次运行脚本时都不使用biocLite()
;只需一次将软件包安装到任何给定的R安装中。
您将在Bioconductor mailing list上获得更具权威性的答案 - 无需订阅。