R:如何编写循环来获取矩阵?

use*_*718 0 for-loop r

感谢diliop为我之前的问题提出的精彩解决方案.

如何获得~1000种蛋白质的成对"序列相似性得分"?

为了建立这个答案,我尝试编写一个循环来获得1000个蛋白质的所有成对的"序列相似性得分",具有以下代码.

for (i in 1:1000){
score <- score(pairwiseAlignment(seqs[[i]]$seq, seqs[[i+1]]$seq, substitutionMatrix=BLOSUM100, gapOpening=0, gapExtension=-5))}
Run Code Online (Sandbox Code Playgroud)

但是,我很难将每个分数转换为a data.frame,这样自动列出所有分数?

seq1 seq2 score
seq1 seq3 score
seq1 seq4 score
....
seq1000 seq1000 score
Run Code Online (Sandbox Code Playgroud)

专家可以给我一些关于如何获得1000 x 1000蛋白质的更多提示吗?

42-*_*42- 5

这似乎是您可以使用expand.grid执行的任务并应用:

seqs <-c("seq1","seq2","seq3"); dat <- expand.grid(seqs,seqs, stringsAsFactors=FALSE)
dat
apply(dat, 1, function(seq) paste(seq[1], seq[2], sep="--") )
#[1] "seq1--seq1" "seq2--seq1" "seq3--seq1" "seq1--seq2" "seq2--seq2" "seq3--seq2" "seq1--seq3"
#[8] "seq2--seq3" "seq3--seq3"
Run Code Online (Sandbox Code Playgroud)

不可否认,如果函数返回f(seq1,seq2)与f(seq2,seq1)相同的值,则会有重复工作,但如果要获得效率,则可以限制应用的第一个参数:

 datr <- dat[dat[,1] > dat[,2] , ]
Run Code Online (Sandbox Code Playgroud)

因此,如果您制作了这样一个限制行数据帧datr,那么可能:

datr$score <-  apply(datr, 1 , function(seq) {
                     score(pairwiseAlignment( seq[1], seq[2], 
                     substitutionMatrix=BLOSUM100, gapOpening=0, gapExtension=-5)) }
Run Code Online (Sandbox Code Playgroud)

(对最后一行中的参数一无所知.你真的应该学习在你的例子中加入一些真实的数据,并列出所需的包libraryrequire调用.)