【问题标题】:R: how to write a loop to get a matrix?R:如何编写循环来获取矩阵?
【发布时间】:2011-09-26 04:14:53
【问题描述】:

感谢 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 蛋白质?

【问题讨论】:

  • score的结构(str)是什么?
  • 我将请求解释为如何构建一个 data.frame,它使用函数 score(pairwiseAlignment(...))seq1seq2 的值计算 score

标签: r for-loop


【解决方案1】:

这似乎是您可以使用 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 调用列出所需的包。)

【讨论】:

    猜你喜欢
    • 2017-09-29
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 2021-05-24
    • 2021-12-31
    • 2012-02-21
    • 2014-10-02
    • 2018-01-30
    相关资源
    最近更新 更多