2014-11-21 186 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