重复循环,直到满足特定条件

时间:2013-09-26 19:12:57

标签: r repeat

有人可以帮我这个吗?假设“p”是完全外源的并且遵循均匀分布。然后我想生成“z”,它是一个TRUE(= 1)或FALSE(= 0)虚拟,并具有每三个元素(1-3,4-6,7-9,...)的总和的属性。 ......,58-60)“z”应大于0.

例如,如果我得到像{1 0 0 1 1 0 0 0 0 0 1 0 ...}这样的“z”,我希望再次重复循环(因为sum(z [7:9]) = 0)绘制一个不同的“错误”,直到我得到一个新的“z”,如{1 1 0 0 0 1 0 1 0 1 0 0 ...},其中每三个元素的所有求和都大于0。我用的如下。我哪里错了?

   set.seed(005)
   p<-runif(60, 0, 1)

   for (i in 1:20) {

     repeat {
       error= -0.2*log((1/runif(60, 0, 1))-1) # a random component
       z=(p<0.5+error) # TRUE/FALSE condition
       z=replace(z, z==TRUE, 1) # replace z to 1 if z is true, else z=0

       if (sum(z[(3*i-2):(3*i)])>0) {break}
      }

   }

1 个答案:

答案 0 :(得分:4)

你的for循环为每个i生成一个新的z。我不认为那是你想要做的。根据我的理解,你试图生成一个新的z然后使用for循环与计数器i来检查三个连续元素的总和。如果是这样,那么你需要有一个循环来生成新的z,然后在这个循环中另一个循环来检查三个连续元素的总和。

我认为这可以满足您的需求。但是当我运行它时,你很快就会得到满意的z。

   set.seed(005)
   p<-runif(60, 0, 1)

   invalidentriesexist =1

      while(invalidentriesexist == 1) {
         error = -0.2*log((1/runif(60, 0, 1))-1) # a random component
         z=(p<0.5+error) # TRUE/FALSE condition

         z=replace(z, z==TRUE, 1) # replace z to 1 if z is true, else z=0
         z=replace(z, z==FALSE, 0) # replace z to 1 if z is true, else z=0

         invalidentriesexist = 0
         i = 1
         while ( i <=20 & invalidentriesexist == 0 ) {
            invalidentriesexist = 0
            if (sum(z[((3*i)-2):(3*i)])==0) {invalidentriesexist = 1}
            cat(i,'\n')
            cat(invalidentriesexist,'\n')
            cat(paste(z,collapse = ","),'\n')
            cat(z[((3*i)-2):(3*i)],'\n\n')
            i = i + 1
         } 

      }