嵌套的问题 while 循环为 R 循环



我正在使用R为我在大学进行的研究项目编写模拟代码。在创建相关数据结构并生成数据后,我试图通过某种效应 K 随机修改 20 x 20 矩阵中观测值的比例 P(以 0.02 为增量)。为了随机确定要修改的观测值,我采样两次等于 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

  4. [1]][rCol[1]] 更改为 1
  5. 对 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 输出" 错误在 while (alrdyModded1[rRow[b]][rCol[b]] == 1) { : 需要真/假的地方缺少值"

当我取出 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]]){

最新更新