【问题标题】:R - multiple nested loopsR - 多个嵌套循环
【发布时间】:2014-01-08 15:51:10
【问题描述】:

我正在尝试编写一个嵌套循环代码来模拟 101 行数据框中的 10 列数据。第一行数据已被指定为起始值。每列应该不同,因为我的矩阵 r 是从随机法线生成的;但是,每列中的结果值完全相同。为循环索引提供一些上下文:

tmax=100; ncol(pop_sims) = 12 (so a total of 10 iterations, 3-12); ncol(r) = 10

for (i in 1:tmax){
 for (j in 3:ncol(pop_sims)){
   for(k in 1:ncol(r)){

   if (pop_sims[i,j]*exp(r[i,k]) <2) {
    pop_sims[i+1,j]<- 0} 
  else {
      pop_sims[i+1,j] <- pop_sims[i,j]*exp(r[i,k])}
}}} 

任何想法都将不胜感激。

更新:我没有使用多个循环,而是省略了矩阵 r 的使用并简化了我的循环。

for (i in 1:tmax){
 for (j in 1:10){

  if (pop_sims[i,j]*exp(r[i,j]) <2) {
    pop_sims[i+1,j]<- 0} 
  else {
      pop_sims[i+1,j] <- pop_sims[i,j]*exp(rnorm(1,mean=0.02, sd=0.1))}
}}

【问题讨论】:

  • 在您的第三个循环中,您为每个 k 值覆盖 pop_sims[i+1,j]。因此,pop_sims[i+1,j] 将根据值k=ncol(r) 设置;你甚至可能没有使用内循环。您能简要描述一下您要完成的工作吗?
  • 是的,我正在尝试将 pop_sims[i+1,j] 设置为前一个(同一列,上一行)值乘以同一列和行指定的随机法线 r(来自正在更新的单元格的矩阵 r)。理想情况下,每个 r 值将被使用一次。那有意义吗?有没有办法在循环内完成这个?
  • @josilber 我如上所述更新。我明白你的意思了。我想不出如何从循环中解决这个问题,所以我只是重新组织了我解决问题的方式。感谢您发现问题!

标签: r nested-loops


【解决方案1】:

循环几乎从来都不是在 R 中完成任务的最佳方式。听起来您想将某个初始值乘以随机数的累积乘积,并将其存储为矩阵的列。 cumprod是如何在R中获得累积积:

tmax = 100
initial.row = 1:10
rbind(initial.row, sapply(initial.row,
                          function(x) x*cumprod(exp(rnorm(tmax-1, mean=.02, sd=.1)))))

#                 [,1]       [,2]      [,3]     [,4]      [,5]      [,6]       [,7]       [,8]      [,9]     [,10]
# initial.row 1.000000   2.000000  3.000000 4.000000  5.000000  6.000000   7.000000   8.000000  9.000000 10.000000
#             1.211479   2.483438  3.376012 3.684407  5.611144  5.689530   6.115748   7.809380  8.364223 10.748108
#             1.221254   2.832064  3.500622 3.417095  5.047067  5.706181   6.445985   9.031854  8.125584 10.115107
#             1.350398   3.002284  3.723416 3.581471  5.121880  7.300373   8.008373  10.679728  7.167270 10.310810
#             1.269193   2.883153  3.546245 3.160029  5.312947  7.983395   6.986608  11.226517  7.166026  9.195459
#             ...

【讨论】:

  • 哇,看起来很棒。我仍然需要构建我的 if 语句,但我确信我可以解决这个问题。这是一种更有效的方式。谢谢。
  • 请记住,将 sapply() 与 rbind() 一起应用只是一个更干净的查找循环。要超越循环,您需要查看向量/矩阵运算。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-15
  • 2021-09-15
  • 1970-01-01
  • 2019-07-13
  • 2016-05-28
  • 2014-03-25
相关资源
最近更新 更多