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

时间:2011-06-30 17:07:00

标签: r for-loop

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

How to get pair-wise "sequence similarity score" for ~1000 proteins?

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

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

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

seq1 seq2 score
seq1 seq3 score
seq1 seq4 score
....
seq1000 seq1000 score

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

1 个答案:

答案 0 :(得分: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"

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

 datr <- dat[dat[,1] > dat[,2] , ]

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

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

(对最后一行中的参数一无所知。你真的应该学会在你的例子中加入一些真实的数据,并列出所需的包libraryrequire。< / p>