【发布时间】:2020-01-20 22:32:03
【问题描述】:
我在尝试多次重复一行代码时遇到了在 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),所以当我重复
错误:无法分配大小为 x Gb 的向量。
我对此感到惊讶,因为我认为我只会将更新的 blank.matrix 存储到内存中 - 但我意识到可能还有其他方法可以通过 apply() 或 for 循环来解决这个问题。感谢您对如何清理此代码的任何帮助!
【问题讨论】:
-
编辑:我现在意识到 rep() 函数甚至没有真正重复该代码,所以也许我比我最初想象的更迷茫。
-
也许你需要
replicate(100, code_goes_here),它使用一个实际的expression,它应该可以满足你的更多需求。 -
我刚试过这个,但它似乎运行了正确的 jaccard 相似性,但由于某种原因,输出矩阵(blank.matrix)在所有运行后都填充了 NA 值,这是我运行的内容:replicate(2, blank.matrix
-
在outside做作业,如
results <- replicate(2, distance(...))? -
results<-replicate(2, ((distance(site_spe3[sample(nrow(site_spe3)),], method='jaccard')<=jaccard.similarity)*1))这真的很接近,但是,它返回一个包含每个矩阵的数组,我想简单地将它们加在一起。我可以在运行后对它们求和,但是当我想运行 100-1000 次时,仅 2 次复制结果数组约为 400mb。我的想法是,必须有某种方法在创建每个结果矩阵时对其求和,以便最终结果只是一个求和矩阵。非常感谢您的帮助!
标签: r loops matrix memory bioinformatics