首页 > 解决方案 > 这里有什么明显的错误会减慢我的代码(嵌套循环)吗?

问题描述

我知道不创建可重现的示例是 StackOverflow 的罪过,但我不确定这是否有必要。以下嵌套循环需要 40 分钟才能运行。ptptdata 中有大约 6,300 行,代表一个人。该循环只是将某人的年龄和持续时间拉到退休。它运行一个循环,增加通货膨胀(取自 infdata)和价值增长(静态 2.5%)直到持续时间。一旦循环结束,它会将最终工资和年龄保存回 ptptdata。然后它向下移动到下一个个体并再次执行此操作。我读过使用向量而不是添加回 ptptdata 会更快,但我不确定我是否遵循如何做到这一点。我原以为代码会很慢,但是我还有很多要添加的内容,如果这个简单的过程需要这么长时间,那将是不可行的。

ptptdata$FinalSalary <- 0
ptptdata$FinalAge <- 0
trial <- 1


    for(row in 1:nrow(ptptdata)){ ### Tells model to complete loop for each individual
      i <- 1 ## Starting point for each individual
      dur <- as.numeric(ptptdata[row,"DurationRet"]) 
      age <- as.numeric(ptptdata[row, "Age"])
      salary <- as.numeric(ptptdata[row,"Current Salary"])
      
      while (i<=dur){
        inflation <- as.numeric(infdata[infdata$Item == 'Inflation' & infdata$Scenario == as.factor(trial),i+2])
        salboy <- salary
        ageboy <- age
        salary <- salboy * (1+meritgrowth)* (1+inflation)
        age <- age + 1
        i <- i + 1  
      }
       ptptdata[row,"FinalSalary"]<-salary
       ptptdata[row,"FinalAge"]<-age
      }

标签: rperformanceloops

解决方案


ptptdata$FinalSalary <- 0
ptptdata$FinalAge <- 0
trial <- 1

durv <- as.numeric(ptptdata$DurationRet)
agev <- as.numeric(ptptdata$Age)
salaryv <- as.numeric(ptptdata[['Current Salary']])

xx <- infdata$Item == 'Inflation' & infdata$Scenario == as.factor(trial)

for(row in 1:nrow(ptptdata)) {
  i <- 1 
  dur <- durv[row]
  age <- agev[row]
  salary <- salaryv[row]
  
  while (i<=dur){
    inflation <- as.numeric(infdata[[i+2]][xx])
    salboy <- salary
    ageboy <- age
    salary <- salboy * (1+meritgrowth)* (1+inflation)
    age <- age + 1
    i <- i + 1  
  }
  ptptdata[row,"FinalSalary"]<-salary
  ptptdata[row,"FinalAge"]<-age
}

也许这会更快......


推荐阅读