【问题标题】:Nested for loop improvement嵌套循环改进
【发布时间】:2016-02-12 18:34:16
【问题描述】:

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

1) 有比使用 rows

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

【问题讨论】:

  • 抱歉,已修复。您有有用的解决方案吗?

标签: r nested-loops


【解决方案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 元素进行子集化。 最后,我认为这实际上不会更整洁或更易读。

【讨论】:

  • 感谢您的建议!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-24
  • 2017-01-06
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
相关资源
最近更新 更多