为什么我会收到此 'number of items to replace is not a multiple of replacement length' 错误?

Why am I getting this 'number of items to replace is not a multiple of replacement length' error?

我一直在尝试调试这段代码,但我看不出错误是从哪里来的。我正在尝试将 beta 分布的值替换为矩阵。我想要的格式是第一列中有模拟编号,然后是后续列中模拟的不同数据点。

我已经检查过,有人提到我可能会返回一个向量而不是一个数字,但我很确定 rbeta 的输出只是一个值,所以为什么它不让我将此值放入矩阵中?

非常感谢。

occ_simulation <- function(nyears, lambda, alpha, beta){
  
  data_matrix <- matrix(, nrow = nyears, ncol = 6)
  
  for (z in 1:nyears){
    data_matrix[z][1] <- z
  }
  
  for (yr in 1:nyears){
    
    poisson_sim = rpois(1, lambda)
    
    for (number_of_events in poisson_sim){
      print(number_of_events)
      
      if (number_of_events == 1){
        
        occ_sim = rbeta(1, alpha, beta)
                # data_matrix[yr][2] <- occ_sim
        
      } else if (number_of_events == 2){
        
          for (i in 2:3){
            
            occ_sim = rbeta(1, alpha, beta)
            # data_matrix[yr][i] <- occ_sim
            
          }
        
      } else if (number_of_events == 3){
          
          for (i in 2:4){
            
            occ_sim = rbeta(1, alpha, beta)
            # data_matrix[yr][i] <- occ_sim
        
          }
        
      } else if (number_of_events == 4){
        
          for (i in 2:5){
            
            occ_sim = rbeta(1, alpha, beta)
            data_matrix[yr][i] <- occ_sim
        
          }
          
      } else{
        
          for (i in 2:6){
            
            occ_sim = rbeta(1, alpha, beta)
            data_matrix[yr][i] <- occ_sim
        }
    
      }
      
    } 

  
  }
  print(data_matrix)
}

manual = occ_simulation(2, 10, 2, 20)

问题出在这些行中:

occ_sim = rbeta(1, alpha, beta)
data_matrix[yr][i] <- occ_sim

yr 变量在 1:nyears 上循环,在该循环中,i 有一个从 26 的循环。所以,假设在第一年,你有 data_matrix[yr] 是一个长度为 1 的向量,并且在 i=2 代码 data_matrix[yr][i] 试图获取向量的第二个元素时经历循环长度为 1,这会产生错误。


编辑 回复评论

如果我理解您要执行的操作,您可以使用 data_matrix[yr, i] 而不是 data_matrix[yr][i] 来修复函数。你也可以做 data_matrix[yr,][i],虽然这不太清楚。这是代码和结果:

occ_simulation <- function(nyears, lambda, alpha, beta){
  
  data_matrix <- matrix(, nrow = nyears, ncol = 6)
  
  for (z in 1:nyears){
    data_matrix[z, 1] <- z
  }
  
  for (yr in 1:nyears){
    
    poisson_sim = rpois(1, lambda)
    
    for (number_of_events in poisson_sim){
      print(number_of_events)
      
      if (number_of_events == 1){
        
        occ_sim = rbeta(1, alpha, beta)
        data_matrix[yr, 2] <- occ_sim
        
      } else if (number_of_events == 2){
        
        for (i in 2:3){
          
          occ_sim = rbeta(1, alpha, beta)
          data_matrix[yr, i] <- occ_sim
          
        }
        
      } else if (number_of_events == 3){
        
        for (i in 2:4){
          
          occ_sim = rbeta(1, alpha, beta)
          data_matrix[yr, i] <- occ_sim
          
        }
        
      } else if (number_of_events == 4){
        
        for (i in 2:5){
          
          occ_sim = rbeta(1, alpha, beta)
          data_matrix[yr, i] <- occ_sim
          
        }
        
      } else{
        
        for (i in 2:6){
          
          occ_sim = rbeta(1, alpha, beta)
          data_matrix[yr, i] <- occ_sim
        }
        
      }
      
    } 
    
    
  }
  data_matrix
}

manual = occ_simulation(2, 10, 2, 20)
manual
#      [,1]       [,2]       [,3]       [,4]      [,5]        [,6]
# [1,]    1 0.05848754 0.04926032 0.03998070 0.1067415 0.006234281
# [2,]    2 0.09572200 0.02727308 0.01144517 0.0799155 0.066248752