R for循环中嵌套while循环的问题

时间:2014-11-21 17:53:05

标签: r for-loop while-loop

我正在使用R代码模拟我在大学进行的研究项目。在创建相关数据结构并生成数据之后,我试图通过某种效应K在20 x 20矩阵中随机修改观察的比例P(以0.02为增量)。为了随机确定要修改的观察,我采样a两次等于P * 400的整数数,表示行(rRow)和列(rCol)索引。为了保证不会多次修改观察,我执行此算法:

  1. 我创建了一个矩阵,alrdyModded,即20 x 20并初始化为0。

  2. 我取rRow和rCol中的第一个值,并检查alrdyModded [rRow [1]] [rCol [1]] == 1;当alrdyModded [rRow [1]] [rCol [1]] == 1时,我随机选择索引的新整数,直到它== 0

  3. 当alrdyModded [rRow [1]] [rCol [1]] == 0时,修改具有相同索引的处理矩阵中的值,并将alrdyModded [rRow [1]] [rCol [1]]更改为1

  4. 重复rRow和rCol载体的整个长度

  5. 我认为执行此操作的一个好方法是嵌套在for循环中的while循环。但是,当我在R中输入以下代码时,我收到以下错误代码:

    R代码:

    propModded<-1.0
    trtSize<-2
    numModded<-propModded*400
    
    trt1<- matrix(rnorm(400,0,1),nrow = 20, ncol = 20)
    cont<- matrix(rnorm(400,0,1),nrow = 20, ncol = 20)
    alrdyModded1<- matrix(0, nrow = 20, ncol = 20)
    
    ## data structures for computation have been intitialized and filled
    
    rCol<-sample.int(20,numModded,replace = TRUE)
    rRow<-sample.int(20,numModded,replace = TRUE)
    
    ## indices for modifying observations have been generated
    
    for(b in 1:numModded){
    
        while(alrdyModded1[rRow[b]][rCol[b]]==1){
            rRow[b]<-sample.int(20,1)
            rCol[b]<-sample.int(20,1)}
    
    trt1[rRow[b]][rCol[b]]<-'+'(trt1[rRow[b]][rCol[b]],trtSize)
        alrdyModded[rRow[b]][rCol[b]]<-1    
    
    }
    
    ## algorithm for guaranteeing no observation in trt1 is modified more than once
    

    R OUTPUT “while中的错误(alrdyModded1 [rRow [b]] [rCol [b]] == 1){:   缺少需要TRUE / FALSE的值“

    当我取出for循环并运行代码时,while循环评估语句就好了,这意味着从rRow和rCol向量访问正确值的问题。我很感激任何解决这个问题的帮助。

1 个答案:

答案 0 :(得分:1)

您似乎没有在矩阵中正确编制索引。它不应该像while(alrdyModded1[rRow[b]][rCol[b]]==1){这样的条件,而应该是这样的:while(alrdyModded1[rRow[b], rCol[b]]==1){。矩阵的索引如下:matrix[1, 1],看起来你忘记了逗号。 for循环应该更接近于此:

for(b in 1:numModded){

  while(alrdyModded1[rRow[b], rCol[b]]==1){
    rRow[b]<-sample.int(20,1)
    rCol[b]<-sample.int(20,1)}

  trt1[rRow[b], rCol[b]]<-'+'(trt1[rRow[b], rCol[b]],trtSize)
  alrdyModded1[rRow[b], rCol[b]]<-1    

}

在旁注中,为什么不在第7行使用alrdyModded1<- matrix(FALSE, nrow = 20, ncol = 20)使alrdyModded1成为布尔矩阵(仅填充TRUE和FALSE值),条件只有while(alrdyModded1[rRow[b], rCol[b]]){