当条件满足时,进行循环结束

时间:2018-02-22 01:25:29

标签: r for-loop

好的,所以我正在编写一些代码,当满足某个值时,它将继续打印0直到组结束。

我写了一些代码,用例子更容易展示:

# STop loss Script example

    # Trade signal and dollar gain loss
    sig <- c(0,0,0,0,1,1,1,1,1,1,1,0,0,0,1,1,1,0)
    dollar <- c(0,0,0,0,100,150,190,-1000,100,100,100,0,0,0,100,100,100,0)
    df <- data.frame(sig,dollar)

    # initialize total column
    df$total = 0
    i=1
    for (i in 1:nrow(df)) { 
      if (df$sig[i] == 1 ) {
        df$total[i] = df$dollar[i] + df$total[i-1]  # cum sum each dollar
    } else if (df$sig[i] == 0) {
      df$total[i] = 0 }
    }


    # Code for stop loss 
    # Initialize stop signal column 
    df$stop <- 0
    stop = -500
    i = 1
    for (i in 1:nrow(df)) { 
      if (df$sig[i] == 1 & df$total[i] > stop) { 
        df$stop[i] = 1 } 
      }

现在我可以解释一下输出:

   sig dollar total stop
1    0      0     0    0
2    0      0     0    0
3    0      0     0    0
4    0      0     0    0
5    1    100   100    1
6    1    150   250    1
7    1    190   440    1
8    1  -1000  -560    0
9    1    100  -460    1
10   1    100  -360    1
11   1    100  -260    1
12   0      0     0    0
13   0      0     0    0
14   0      0     0    0
15   1    100   100    1
16   1    100   200    1
17   1    100   300    1
18   0      0     0    0

止损代码,当我遇到一个df $总值&lt; -500然后我打印0而不是1.直接前进。但是,因为满足这个条件,只要df $ sig == 1,我希望继续使df $ total == 0.然后对于下一个df $ sig == 1(可能是第2组)离子线15,重复这个过程。

所需的输出也可能有帮助

> df
   sig dollar total stop
1    0      0     0    0
2    0      0     0    0
3    0      0     0    0
4    0      0     0    0
5    1    100   100    1
6    1    150   250    1
7    1    190   440    1
8    1  -1000  -560    0
9    1    100  -460    0
10   1    100  -360    0
11   1    100  -260    0
12   0      0     0    0
13   0      0     0    0
14   0      0     0    0
15   1    100   100    1
16   1    100   200    1
17   1    100   300    1
18   0      0     0    0

到目前为止,我已尝试过此代码:

for (i in 1:nrow(df)) { 
  if (df$sig[i] == 1 & df$total[i] > stop) { 
    df$stop[i] = 1 } 
  else if (df$total[i-1] == 0) {
    df$stop[i] = 0 }
  }

的想法是,如果从1次迭代前的df $停止0为0,那么下一个d $停止将为0.这是有问题的,因为我已经领先0直到满足第一组df $ sig = 1。 ..因此我有前导0,df $ stop = 0并且它在所有迭代中运行0。

所以我考虑将所有0都转换为NA,这样代码就不会触发前导0。这引发了一个错误。有人看到方便的解决方案?

1 个答案:

答案 0 :(得分:1)

您可以为此更改最后一部分:

for (i in 1:nrow(df)) { 
  if (df$sig[i] == 1 & df$total[i] > stop) { 
    df$stop[i] = 1
    if (i > 1) {
      if (df$sig[i - 1] == 1 & df$stop[i - 1] == 0) {
        df$stop[i] = 0
      }
    }
  } 
}

结果是:

 sig dollar total stop
1    0      0     0    0
2    0      0     0    0
3    0      0     0    0
4    0      0     0    0
5    1    100   100    1
6    1    150   250    1
7    1    190   440    1
8    1  -1000  -560    0
9    1    100  -460    0
10   1    100  -360    0
11   1    100  -260    0
12   0      0     0    0
13   0      0     0    0
14   0      0     0    0
15   1    100   100    1
16   1    100   200    1
17   1    100   300    1
18   0      0     0    0