【问题标题】:Getting R to skip certain index values with the help of if statements, within while loops在 if 语句的帮助下,让 R 在 while 循环中跳过某些索引值
【发布时间】:2019-01-13 14:27:46
【问题描述】:

我经历了多个 R-while-if 问题,但没有找到类似的问题。如果有人问过,请指导我回答。

所以我有一个N=200 编号为0 的条目的向量V。每个条目都表示一个“bin”。由于不同的原因,我跳过了前 3 个垃圾箱。现在对于i= 3:N 的垃圾箱数量,我使用了一个 while 循环。

  • 对于每个ith 个bin,我生成一个介于01 之间的随机数。
  • 如果随机数小于某个数值(这里是 0.66)那么,我只需将 Vector V 中索引 i 处的 0 替换为 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 loops if-statement while-loop


    【解决方案1】:

    您的问题是R 中的大多数函数不会修改它们所应用的对象。相反,它们会返回您必须分配给新对象或原始对象(更新它)的原始对象的修改版本。

    因此,您需要将修改后的版本分配回Time,而不是只运行replace(Time, i, 1)(它不会更新Time 向量),如下所示:

    Time <- replace(Time, i, 1)
    

    或者,更好的是,使用方括号表示法直接更新:

    Time[i] <- 1
    

    此外,您需要更新矢量TimeTime &lt;- replace(Time, i, 1),然后再更新索引ii = i + 2。如果您只想将循环应用于i &gt; 3,则需要设置i = 4。最后,在runif(1) &lt; 0.66 的情况下,如果你想跳过Time 中接下来的两个 条目,你应该将i 更新为i &lt;- 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
        }
    }
    

    【讨论】:

    • 好答案!要获得完整的答案,您应该加强建议,使用方括号符号而不是 replacesubset 等函数:stackoverflow.com/questions/9860090/why-is-better-than-subset
    • @divibisan replace[&lt;-,所以我不确定批评是否适用。我想 OP 的真正改进将来自使用矢量化代码而不是循环......
    • @Frank 是的,subset 不是这个问题的相关功能。但我不认为矢量化这将是微不足道的,看到每一步都依赖于前一步?
    • @Frank:很难说向量化这个程序的最佳方法,因为它不是很清楚(至少对我来说)OP 想要做什么,所以很难说如何做得更好。但是,如果您有想法,则应该编写自己的答案!
    • @Frank replace 好点,我之前没看源码。我仍然认为它不应该用于明确目的,但你说得对,它不应该有任何风险。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 2022-01-12
    • 2015-05-19
    • 1970-01-01
    相关资源
    最近更新 更多