在while循环中使用if语句使R跳过某些索引值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在while循环中使用if语句使R跳过某些索引值相关的知识,希望对你有一定的参考价值。
我经历过多次R-while-if问题而我没有找到类似的问题。如果有人问我,请指导我。
所以我有N=200
的0
条目的向量V.每个条目都表示“bin”。我跳过前3个箱子,原因各有不同。现在,对于i= 3:N
箱数,我使用了一个while循环。
- 对于每个
i
th数量的bin,我在0
和1
之间生成一个随机数。 - 如果随机数小于某个数值(这里是0.66)那么,我只需将Vector
0
中i
的V
替换为1,同时我希望while循环跳过下两个值。 - 如果随机数大于数值,我只考虑下一个
i
。 这是我正在运行的代码:N = 200 Time <- rep(0, N) Time <- replace(Time, 3, 1) i = 5 while (i <= N){ p <- runif(1) if(p < 0.66){ i= i+ 2; replace(Time, i, 1) } else { i <- i+1 } }
我不是很擅长R,这是我一直试图使用的组合,让R做我想做的事情,但它显然不起作用。我可能会遗漏一些明显的东西。
答案
您的问题是R
中的大多数函数都不会修改它们应用的对象。相反,它们返回原始对象的修改版本,您必须将其分配给新对象或原始对象(更新它)。
所以,不要只运行replace(Time, i, 1)
(不更新Time
向量),而是需要将修改后的版本分配回Time
,如下所示:
Time <- replace(Time, i, 1)
或者,更好的是,使用方括号表示法直接更新:
Time[i] <- 1
此外,在更新索引Time
,Time <- replace(Time, i, 1)
之前,您需要更新矢量i
,i = i + 2
。如果你只想把你的循环应用到i > 3
,那么你需要设置i = 4
。最后,在runif(1) < 0.66
的情况下,如果你想跳过Time
中的下两个条目,你应该将i
更新为i <- i + 3
。
总而言之,您应该按如下方式修改循环:
N = 200
Time <- rep(0, N)
Time[3] <- 1
i <- 4
while (i <= N){
p <- runif(1)
if(p < 0.66){
Time[i] <- 1
i <- i + 3
} else {
i <- i+1
}
}
以上是关于在while循环中使用if语句使R跳过某些索引值的主要内容,如果未能解决你的问题,请参考以下文章