R - 在固定数量的行上结束循环

时间:2017-07-03 02:04:44

标签: r

我有一个循环,当某个条件退出时开始。它在值低于-1.0时开始。当条件超过1.0

时,循环退出
    #Loop for long entry and exit signal 
    entry <- -1.0     #Input value for entry
    exit <- 1.o       #Input value for exit


mydf$sig_long[[1]] = ifelse(mydf$roll.z.score.n3[[1]] < (entry), 1, 0)

    for (i in 2:nrow(mydf)){
      mydf$sig_long[i] = ifelse(mydf$roll.z.score.n3[i] < (entry), 1,
                              ifelse(mydf$roll.z.score.n3[i] > (exit), 0,
                              mydf$sig_long[i-1]))
    }

我想学习如何使用相同的循环,而不是退出值&gt; 1.0在设定的行数后退出。例如,我将nline变量设置为5.它将循环并打印1,在初始输入后总共5行。下面的示例数据框:

    roll.z.score.n3
1   0
2   0
3   0.651651537
4   -1.153593891
5   -0.926552368
6   -0.369016769
7   0.65405595
8   -1.139305279
9   0.358231351
10  1.135314685
11  0.944997472
12  -0.293105191
13  -1.146659778
14  -0.66246734
15  -1.131901741
16  -0.600480649
17  -1.152333435
18  1.1025176
19  -0.144684006
20  -0.678000883
21  -1.146875039
22  -1.132235788
23  0.115583229
24  0.645489447
25  1.148754398
26  0.988193418
27  -0.818892395

脚本运行后,我会使用zoo来对sig_long列进行+1行。

  new.df$sig_long <- Lag(new.df$sig_long,1)

代码测试

好的,我看到了这个问题。当我们指定循环的第一部分进入和退出-1.0和1.0之间时,这将在new.df $ sig_long列中的这两个条件之间打印1。如果我将nlines设置为5,则会出现问题。进入/退出可能会退出sig_long列中的3行中的交易。如果是这种情况,rollum在该列中没有1来计算,即使我想要保留5行,如果只有3 1来自条目...它将无法进行计算5行保持时间。也许我们可以像这样使用循环的第一部分,以便在输入条件下打印1:

new.df$sig_long <- ifelse(new.df$roll.z.score.n3 < -1.0 , 1, 0) #Set 1 at entry criteria

在每个&lt; -1.0值。接下来将是如何计算从那一点开始的+5行。计数直到... 1,2,3,4,5,否则0 ... 0,直到下一个+1 ....计数到1,2,3,4,5,否则0,0直到下一个+1 ....

我可以看到逻辑......如果newdf $ sig_long == 1,则计算到nlines 5,否则为0,重复......

然后循环的第二部分将起作用我认为new_sig_long列

1 个答案:

答案 0 :(得分:0)

做了很多改变。现在应该可以了:

zz = '
    roll.z.score.n3 sig_long    
1           NA          0          
2           NA          0          
3   -1.135974424        0          
4   0.193311168         1          
5   0.714285714         1          
6   -1.148753543        1          
7   -0.942160394        1          
8   -0.695763683        1          
9   1.140646864         1          
10  0.985196899         0          
11  -0.768766574        0          
12  -1.011293858        0          
13  -0.516703612        1          
14  -1.120897077        1          
15  1.091089451         1          
16  0.968364052         0          
17  0.872871561         0          
18  1.099524999         0          
19  0.918397948         0   
'

df <- read.table(text = zz, header = TRUE)
df = na.omit(df)

df$sig_long[[1]] = ifelse(df$roll.z.score.n3[[1]] < (-1), 1, 0)

for (i in 2:nrow(df)){
  df$sig_long[i] = ifelse(df$roll.z.score.n3[i] < (-1), 1,
                          ifelse(df$roll.z.score.n3[i] > 1, 0,
                                 df$sig_long[i-1]))
}

df$sig_long <- Lag(df$sig_long, 1)
colnames(df[, 2]) = "sig_long"

df = na.omit(df)
nlines = 5

df$rollsum = rollsumr(df$sig_long, k = nlines, fill = 0)
colnames(df[, 3]) = "rollsum"
df$new_sig_long[[1]] = ifelse(df$roll.z.score.n3[[1]] < (-1), 1, 0)

for (i in 2:nrow(df)){
  df$new_sig_long[i] = ifelse(df$roll.z.score.n3[i] < (-1) & df$rollsum[i] < 5, 1,
                              ifelse(df$roll.z.score.n3[i] > 1 | df$rollsum[i] >= 5, 0,
                                     df$sig_long[i-1]))
}

df

输出:

    > df
       roll.z.score.n3 sig_long rollsum new_sig_long
  #  4        0.1933112        1       0            0
  #  5        0.7142857        1       0            1
  #  6       -1.1487535        1       0            1
  #  7       -0.9421604        1       0            1
  #  8       -0.6957637        1       5            0
  #  9        1.1406469        1       5            0
  #  10       0.9851969        0       4            1
  #  11      -0.7687666        0       3            0
  #  12      -1.0112939        0       2            1
  #  13      -0.5167036        1       2            0
  #  14      -1.1208971        1       2            1
  #  15       1.0910895        1       3            0
  #  16       0.9683641        0       3            1
  #  17       0.8728716        0       3            0
  #  18       1.0995250        0       2            0
  #  19       0.9183979        0       1            0

如果您愿意,可以使用lag的{​​{1}}。