首页 > 解决方案 > 多次在矩阵上重复一个函数并对结果矩阵求和

问题描述

尝试多次重复一行代码时,我遇到了在 R 中编写代码的问题。

我写了以下代码:

rep(blank.matrix<-((distance(site.by.species[sample(nrow(site.by.species)),], method='jaccard')<=existing.jaccard.similarity)*1)+blank.matrix,times=100)

我试图按物种矩阵排列一个站点:

site.by.species[sample(nrow(site.by.species)),]

然后从中得到一个jaccard相似度矩阵:

distance("", method='jaccard')

然后将它与现有的相似度矩阵进行比较,我想在其中找到小于或等于它的所有值

<=existing.jaccard.similarity

然后我想运行这个 100 次 - 将每个创建的矩阵中的 1 和 0 加在一起,这样我就有一个输出,它给出了我的existing.jaccard.similarity值小于等于我的置换值的次数。

我遇到的问题是我的矩阵非常大(8000x700),所以虽然当我重复 <5 次时这段代码似乎运行,但当我尝试重复更多次时,我得到了错误:

错误:无法分配大小为 x Gb 的向量。

我对此感到惊讶,因为我认为我只会将更新的 blank.matrix 存储到内存中 - 但我意识到可能还有其他方法可以通过apply()或 for 循环来解决这个问题。我感谢任何有关如何清理此代码的帮助!

标签: rloopsmatrixmemorybioinformatics

解决方案


我找到了一个解决方案:

repeat{
  results = ((distance(site.by.species[sample(nrow(site.by.species)),],method='jaccard')<=jaccard.similarity)*1) + results
   print(results[1,1])
   if (results[1,1] == 100){
     print("repeat loop ends");
     break
   }
}

我在这里使用了 repeat 函数,因为我只想输出单个矩阵,而不是将所有矩阵一起输出为一个数组,这就是我使用该replicate()方法得到的结果。repeat一旦命中 100,我就结束了,results[1,1]因为矩阵中的这个元素是同一站点的相似性,它将始终等于jaccard.similarity表([2,2];[3,3]; 等等也可以),所以每个运行将 1 添加到此列。

可能有更简单的方法可以做到这一点!


推荐阅读