2016-02-11 79 views
0

我正在嘗試使用嵌套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 
    } 
} 
+0

對不起,修正了它。你有一個有用的解決方案? – tlyons253

回答

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的長向量。 然後在每個循環中,您將對該向量的下一個元素進行子集劃分。最後,我不認爲這樣做會更整潔或更具可讀性。

+0

感謝您的建議! – tlyons253