r - 这里有什么明显的错误会减慢我的代码(嵌套循环)吗?
问题描述
我知道不创建可重现的示例是 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
}
解决方案
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
}
也许这会更快......
推荐阅读
- mongodb - MongoDb 聚合格式输出
- ruby - Ruby 将 csv 日期格式化为无效日期(argumentError)
- vba - Microsoft Visio VBA CustomUI 功能区帮助 - 更改 EditBox 的默认值
- sql - 如何在 Laravel Eloquent 中使用 DISTINCT ON
- node.js - 如何删除 MongoDB 中的 ObjectID 数组?
- ios - 单击按钮后如何从tabview中隐藏/删除视图
- charts - 如何使用 billboard.js 制作每日时间表?
- reactjs - 在 store 初始化后立即调度 Redux Saga Actions 而不是 useEffect
- java - 具有不同父级的Java中具有通用控件的HTML绘画
- docker - SonarQube 码头工人不断停止