【发布时间】:2018-03-29 20:05:55
【问题描述】:
我从事社区生态工作,我正在尝试将我的矩阵随机化约 999 次,并为这 999 次中的每一次提取一个 beta 多样性值。这有望给我一个空分布来比较我的实际值。但是,我很难运行循环函数来执行此操作。
下面是一些示例数据:
com.dat<-matrix(c(10,0,0,0,5,0, 0,3,4,0,0,9, 0,0,8,6,0,0, 7,0,9,0,0,0,
5,3,2,2,1,2),nrow=5,byrow=TRUE)
rownames(com.dat)<-c("Site1","Site2","Site3","Site4","Site5")
colnames(com.dat)<-
c("Species1","Species2","Species3","Species4","Species5","Species6")
这是我一次迭代要做的:
library(picante)
x<-randomizeMatrix(com.dat, null.model = "richness", iterations = 1000)
library(betapart)
b<-beta.multi.abund(x, index.family = "bray")
B 是我想要保留的值,并有 998 个其他值。 所以我尝试运行一个循环来获取从 randomizeMatrix 函数随机生成的 999 个矩阵
table<-list()
for (i in 1:999) {
table[i]<-randomizeMatrix(com.dat, null.model = "richness", iterations =
1000)
}
现在我的循环制作能力仍处于新手水平,但我很确定上述循环应该可以工作。列表能够存储多个矩阵(据我所知),所以 table[i] 应该能够保存 999 个初始矩阵的随机版本,对吗?然而,每次我尝试运行它时,都会导致我的 Rstudio 会话超时。
最终我想获得一个包含 999 个随机“b”值的数据框。任何帮助,将不胜感激。
【问题讨论】:
-
您可以使用
lapply即lapply(1:999, function(i) randomizeMatrix(com.dat, null.model = "richness", iterations = 1000))创建矩阵的list。此外,如果您正在使用for循环,请将list初始化为您需要的长度,即lst <- vector('list', 999)并分配输出,如lst[[i]] <- randomize... -
@akrun 好的,谢谢,我想补充一点,函数代码'b
-
我并不完全清楚。你需要
do.call(cbind, lapply(1:2, function(i) {x <- randomizeMatrix(com.dat, null.model = "richness", iterations = 1000);unlist(beta.multi.abund(x, index.family = "bray"))}))吗(这里我只用了2次迭代) -
@akrun 是的,几乎!除了我希望这些列是 bray.bal、bray.gray 和 beta.bray (在您的示例中它们是行)并且我希望这些行代表我执行该函数的每个矩阵(因此将是 999 行)
-
我发布了您要求的更改