嵌套for循环改进

Nested for loop improvement

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

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

2) 有比for循环更优雅的解决方案吗?

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
   }
}

您可以将行计数器替换为(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 元素进行子集化。 最后,我认为这实际上不会更整洁或更具可读性。