我正在使用R代码模拟我在大学进行的研究项目。在创建相关数据结构并生成数据之后,我试图通过某种效应K在20 x 20矩阵中随机修改观察的比例P(以0.02为增量)。为了随机确定要修改的观察,我采样a两次等于P * 400的整数数,表示行(rRow)和列(rCol)索引。为了保证不会多次修改观察,我执行此算法:
我创建了一个矩阵,alrdyModded,即20 x 20并初始化为0。
我取rRow和rCol中的第一个值,并检查alrdyModded [rRow [1]] [rCol [1]] == 1;当alrdyModded [rRow [1]] [rCol [1]] == 1时,我随机选择索引的新整数,直到它== 0
当alrdyModded [rRow [1]] [rCol [1]] == 0时,修改具有相同索引的处理矩阵中的值,并将alrdyModded [rRow [1]] [rCol [1]]更改为1
重复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向量访问正确值的问题。我很感激任何解决这个问题的帮助。
答案 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]]){
?