2014-11-21 206 views
1

我正在使用R來爲我在大學進行的研究項目編寫模擬代碼。在創建相關數據結構並生成數據後,我試圖通過某種效應K隨機修改20×20矩陣中的觀測比例P(以0.02爲增量)。爲了隨機確定要修改的觀測值,整數的數量等於P * 400兩次以表示行(rRow)和列(rCol)索引。爲了保證沒有觀察將被修改不止一次,我執行此算法:嵌套while循環for R for循環的問題

  1. 我創建矩陣,alrdyModded,即20×20並初始化爲0。

  2. 我把rRow和rCol中的第一個值,並檢查是否alrdyModded [rRow [1]] [rCol [1]] == 1; WHERE 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,I收到以下錯誤代碼:

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輸出 「錯誤而(alrdyModded1 [rRow並[b] ] [rCol [b]] == 1){: 缺少TRUE/FALSE所需的值「

當我取出for循環並運行代碼時,while循環評估語句就好了,這意味着問題從訪問正確的值rRow和rCol向量。我將不勝感激任何幫助解決這個問題。

回答

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  

} 

在一個側面說明,爲什麼不把alrdyModded1布爾矩陣(填充只有true和false值)與alrdyModded1<- matrix(FALSE, nrow = 20, ncol = 20)在第7行,和具備的條件是而不是while(alrdyModded1[rRow[b], rCol[b]]){

+1

看來我把我的索引與Java語言混淆了。感謝您的推薦,這似乎是更好的路線。 – Dan 2014-11-21 19:16:40