嵌套for循环改进

时间:2016-02-11 22:56:42

标签: r nested-loops

我正在尝试使用嵌套for循环编写一个简单的种群模型。我想将人口预测为10年,我希望将此预测运行100次。我需要每个时间步的输出并包括一个计数器,所以我知道结果对应哪一年的迭代。我有一个使用此代码运行的示例,但我想知道是否:

1)比使用行< -rows + 1命令每次重置和推进计数器有更优雅的解决方案吗?

2)有一个比循环更优雅的解决方案来实现这个目标吗?

library(VGAM)
popdata<-matrix(nrow=1000,ncol=3)
dimnames(popdata)[[2]]<-c('iteration','year','popsize')
rows<-1
for (iteration in 1:100){
   pop<-50

   for(year in 1:10){
      popdata[rows,1]<-iteration
      popdata[rows,2]<-year

      pop<-rbetabinom(1,pop,0.6)

      popdata[rows,3]<-pop
      rows<-rows+1
   }
}

1 个答案:

答案 0 :(得分:1)

您可以用(iteration - 1) * 10 + year替换行计数器。 您还可以通过将迭代和年份数据分配到外部来清理循环中完成的工作,因为您事先知道这些结果将是什么。

这就像

popdata<-matrix(nrow=1000,ncol=3)
dimnames(popdata)[[2]]<-c('iteration','year','popsize')

# Do the deterministic stuff first
popdata[, 1] <- rep(1:100, each = 10) 
popdata[, 2] <- rep(1:10, times = 100)

for (iteration in 1:100){
   pop<-50

   for(year in 1:10){
      rows <- (iteration - 1) * 10 + yea
      pop<-rbetabinom(1,pop,0.6)
      popdata[rows,3]<-pop
   }
}

由于pop取决于之前的pop,因此完全简化内循环并不容易。 我认为这种方法是将所有二项式结果生成为1和0的长向量。 然后在每个循环中,您将对该向量的下一个pop元素进行子集化。 最后,我认为这不会更整洁或更具可读性。