簡體   English   中英

R的for循環中嵌套while循環的問題

[英]Issues with nested while loop in for loop for R

我正在使用R為我在大學進行的研究項目編寫模擬代碼。 創建相關數據結構並生成數據后,我嘗試通過某種效果K隨機修改20 x 20矩陣中觀察值的比例P(以0.02為增量)。為了隨機確定要修改的觀察值,我對a等於P * 400的整數的兩倍,代表行(rRow)和列(rCol)索引。 為了保證沒有觀察值會被修改一次以上,我執行以下算法:

  1. 我創建一個矩陣alrdyModded,它是20 x 20並初始化為0s。

  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向量的長度

我相信執行此操作的一個好方法是嵌套在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向量訪問正確的值存在問題。 對於解決此問題的任何幫助,我將不勝感激。

看來您沒有在矩陣內建立索引。 而不是像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    

}

附帶說明一下,為什么不使alrdyModded1為布爾型矩陣(僅填充TRUE和FALSE值),並在第7行中使用alrdyModded1<- matrix(FALSE, nrow = 20, ncol = 20) ,並且條件為while(alrdyModded1[rRow[b], rCol[b]]){代替?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM