递增循环是 R 中三重嵌套循环的正确方式

Posted

技术标签:

【中文标题】递增循环是 R 中三重嵌套循环的正确方式【英文标题】:Incrementing loops the right way for a triple nested loop in R 【发布时间】:2016-03-11 09:40:01 【问题描述】:

我正在编写一个三重嵌套循环,如下所示,但无法理解如何分别或一个一个地递增它们中的每一个。

我已经想出了如何在使用 next 进入 j 和 k 循环之前增加 i ,但在那之后我迷路了

如果我只想增加 k 而不是 j,我该怎么办?反之亦然?

如果我想同时增加 j 和 k 而不是 i 怎么办?

如果我想在 j 和 k 循环的中间增加一次 i 怎么办?

for(i in 2:nrow(df))
        if(is.na(df[i,6]) == TRUE)
          score[i] = 0
          next
        
        d = df[i, 3:32] == df[i-1, 3:32]
        if(all(d) == TRUE)
          score[i] = 0
          next
        
        for(j in h)
          for(k in h)
        bidside = data.frame(DateTime=DateTime, Seq=Seq, BP1=BP1, BQ1=BQ1, BP2=BP2, BQ2=BQ2, BP3=BP3, BQ3=BQ3, BP4=BP4, BQ4=BQ4, BP5=BP5, BQ5=BQ5)
        askside = data.frame(DateTime=DateTime, Seq=Seq, AP1=AP1, AQ1=AQ1, AP2=AP2, AQ2=AQ2, AP3=AP3, AQ3=AQ3, AP4=AP4, AQ4=AQ4, AP5=AP5, AQ5=AQ5)
        x = askside[i, 3:12] == askside[i-1, 3:12]
        if(all(x) == TRUE)
          if(bidside[i,j] == bidside[i-1,k)
        
      

任何建议或帮助将不胜感激。如果您需要更多信息,请告诉我。

编辑:示例数据

> head(df, 50)
       DateTime Seq   BP1 BQ1 BO1   AP1 AQ1 AO1   BP2 BQ2 BO2   AP2 AQ2 AO2   BP3 BQ3 BO3   AP3 AQ3 AO3   BP4 BQ4 BO4   AP4 AQ4 AO4   BP5 BQ5 BO5   AP5 AQ5 AO5
1  1.442375e+18   1     0   0   0 72830   1   1     0   0   0     0   0   0     0   0   0     0   0   0     0   0   0     0   0   0     0   0   0     0   0   0
2  1.442375e+18   2 70730   1   1 72830   1   1     0   0   0     0   0   0     0   0   0     0   0   0     0   0   0     0   0   0     0   0   0     0   0   0
3  1.442375e+18   3 70730   1   1 72830   1   1 70185   1   1     0   0   0     0   0   0     0   0   0     0   0   0     0   0   0     0   0   0     0   0   0
4  1.442375e+18   4 70730   1   1 72830   1   1 70340   1   1     0   0   0 70185   1   1     0   0   0     0   0   0     0   0   0     0   0   0     0   0   0
5  1.442375e+18   5 70730   1   1 72830   1   1 70340   1   1     0   0   0 70285   1   1     0   0   0 70185   1   1     0   0   0     0   0   0     0   0   0
6  1.442375e+18   6 70735   1   1 72830   1   1 70730   1   1     0   0   0 70285   1   1     0   0   0 70185   1   1     0   0   0     0   0   0     0   0   0
7  1.442375e+18   7 70735   2   1 72830   1   1 70730   1   1     0   0   0 70285   1   1     0   0   0     0   0   0     0   0   0     0   0   0     0   0   0
8  1.442375e+18   8 70735   3   1 72830   1   1 70730   1   1     0   0   0     0   0   0     0   0   0     0   0   0     0   0   0     0   0   0     0   0   0
9  1.442375e+18   9 70905   1   1 72830   1   1 70735   3   1     0   0   0 70730   1   1     0   0   0     0   0   0     0   0   0     0   0   0     0   0   0
10 1.442375e+18  10 70910   1   1 72830   1   1 70905   1   1     0   0   0 70735   2   1     0   0   0 70730   1   1     0   0   0     0   0   0     0   0   0
11 1.442375e+18  11 70910   2   1 72830   1   1 70905   1   1     0   0   0 70735   1   1     0   0   0 70730   1   1     0   0   0     0   0   0     0   0   0
12 1.442375e+18  12 70910   2   1 72535   4   1 70905   1   1 72830   1   1 70735   1   1     0   0   0 70730   1   1     0   0   0     0   0   0     0   0   0
13 1.442375e+18  13 70910   2   1 72430   1   1 70905   1   1 72535   4   1 70735   1   1 72830   1   1 70730   1   1     0   0   0     0   0   0     0   0   0
14 1.442375e+18  14 70910   2   1 72370   1   1 70905   1   1 72430   1   1 70735   1   1 72535   4   1 70730   1   1 72830   1   1     0   0   0     0   0   0
15 1.442375e+18  15 70910   2   1 72370   1   1 70905   1   1 72410   1   1 70735   1   1 72430   1   1 70730   1   1 72535   4   1     0   0   0 72830   1   1
16 1.442375e+18  16 70910   2   1 72365   4   1 70905   1   1 72370   1   1 70735   1   1 72410   1   1 70730   1   1 72430   1   1     0   0   0 72830   1   1
17 1.442375e+18  17 70910   2   1 72360   1   1 70905   1   1 72365   4   1 70735   1   1 72410   1   1 70730   1   1 72430   1   1     0   0   0 72830   1   1
18 1.442375e+18  18 70910   2   1 72360   2   1 70905   1   1 72365   4   1 70735   1   1 72430   1   1 70730   1   1 72830   1   1     0   0   0     0   0   0
19 1.442375e+18  19 70910   2   1 72355   4   1 70905   1   1 72360   2   1 70735   1   1 72430   1   1 70730   1   1 72830   1   1     0   0   0     0   0   0
20 1.442375e+18  20 70910   2   1 72355   4   1 70905   1   1 72360   3   1 70735   1   1 72830   1   1 70730   1   1     0   0   0     0   0   0     0   0   0
21 1.442375e+18  21 70910   2   1 72350   1   1 70905   1   1 72355   4   1 70735   1   1 72360   2   1 70730   1   1 72830   1   1     0   0   0     0   0   0
22 1.442375e+18  22 70910   2   1 72350   2   1 70905   1   1 72355   4   1 70735   1   1 72360   1   1 70730   1   1 72830   1   1     0   0   0     0   0   0
23 1.442375e+18  23 70910   2   1 72350   3   1 70905   1   1 72355   4   1 70735   1   1 72830   1   1 70730   1   1     0   0   0     0   0   0     0   0   0
24 1.442375e+18  24 70910   2   1 72345   4   1 70905   1   1 72350   3   1 70735   1   1 72830   1   1 70730   1   1     0   0   0     0   0   0     0   0   0
25 1.442375e+18  25 70910   2   1 72340   1   1 70905   1   1 72345   4   1 70735   1   1 72350   2   1 70730   1   1 72830   1   1     0   0   0     0   0   0
26 1.442375e+18  26 70910   2   1 72340   2   1 70905   1   1 72345   4   1 70735   1   1 72350   1   1 70730   1   1 72830   1   1     0   0   0     0   0   0
27 1.442375e+18  27 70910   2   1 72340   3   1 70905   1   1 72345   4   1 70735   1   1 72830   1   1 70730   1   1     0   0   0     0   0   0     0   0   0
28 1.442375e+18  28 70910   2   1 72340   3   1 70905   1   1 72345   4   1 70735   1   1 72830   1   1 70730   1   1     0   0   0 69880  10   1     0   0   0
29 1.442375e+18  29 70910   2   1 72340   3   1 70905   1   1 72345   4   1 70735   1   1 72830   1   1 70730   1   1     0   0   0 69880  10   1     0   0   0
30 1.442375e+18  30 70910   3   1 72340   3   1 70905   1   1 72345   4   1 70730   1   1 72830   1   1 69880  10   1     0   0   0 69790  10   1     0   0   0
31 1.442375e+18  31 70910   2   1 72340   3   1 70905   1   1 72345   4   1 70730   1   1 72830   1   1 70185   1   1     0   0   0 69880  10   1     0   0   0
32 1.442375e+18  32 70910   2   1 72295   4   1 70905   1   1 72340   3   1 70730   1   1 72830   1   1 70185   1   1     0   0   0 69880  10   1     0   0   0
33 1.442375e+18  33 70910   2   1 72290   1   1 70905   1   1 72295   4   1 70730   1   1 72340   2   1 70185   1   1 72830   1   1 69880  10   1     0   0   0
34 1.442375e+18  34 70910   2   1 72290   2   1 70905   1   1 72295   4   1 70730   1   1 72340   1   1 70185   1   1 72830   1   1 69880  10   1     0   0   0
35 1.442375e+18  35 70910   2   1 72285   4   1 70905   1   1 72290   2   1 70730   1   1 72340   1   1 70185   1   1 72830   1   1 69880  10   1     0   0   0
36 1.442375e+18  36 70910   2   1 72280   1   1 70905   1   1 72285   4   1 70730   1   1 72290   1   1 70185   1   1 72340   1   1 69880  10   1 72830   1   1
37 1.442375e+18  37 70910   2   1 72280   2   1 70905   1   1 72285   4   1 70730   1   1 72340   1   1 70185   1   1 72830   1   1 69880  10   1     0   0   0
38 1.442375e+18  38 70910   2   1 72275   4   1 70905   1   1 72280   2   1 70730   1   1 72340   1   1 70185   1   1 72830   1   1 69880  10   1     0   0   0
39 1.442375e+18  39 70910   2   1 72270   1   1 70905   1   1 72275   4   1 70730   1   1 72280   1   1 70185   1   1 72340   1   1 69880  10   1 72830   1   1
40 1.442375e+18  40 70910   2   1 72270   2   1 70905   1   1 72275   4   1 70730   1   1 72340   1   1 70185   1   1 72830   1   1 69880  10   1     0   0   0
41 1.442375e+18  41 70910   2   1 72265   4   1 70905   1   1 72270   2   1 70730   1   1 72340   1   1 70185   1   1 72830   1   1 69880  10   1     0   0   0
42 1.442375e+18  42 70910   2   1 72260   1   1 70905   1   1 72265   4   1 70730   1   1 72270   1   1 70185   1   1 72340   1   1 69880  10   1 72830   1   1
43 1.442375e+18  43 70910   2   1 72260   2   1 70905   1   1 72265   4   1 70730   1   1 72340   1   1 70185   1   1 72830   1   1 69880  10   1     0   0   0
44 1.442375e+18  44 70910   2   1 72255   4   1 70905   1   1 72260   2   1 70730   1   1 72340   1   1 70185   1   1 72830   1   1 69880  10   1     0   0   0
45 1.442375e+18  45 70910   2   1 72250   1   1 70905   1   1 72255   4   1 70730   1   1 72260   1   1 70185   1   1 72340   1   1 69880  10   1 72830   1   1
46 1.442375e+18  46 70910   2   1 72250   2   1 70905   1   1 72255   4   1 70730   1   1 72340   1   1 70185   1   1 72830   1   1 69880  10   1     0   0   0
47 1.442375e+18  47 70910   2   1 72245   4   1 70905   1   1 72250   2   1 70730   1   1 72340   1   1 70185   1   1 72830   1   1 69880  10   1     0   0   0
48 1.442375e+18  48 70910   2   1 72240   1   1 70905   1   1 72245   4   1 70730   1   1 72250   1   1 70185   1   1 72340   1   1 69880  10   1 72830   1   1
49 1.442375e+18  49 70910   2   1 72240   2   1 70905   1   1 72245   4   1 70730   1   1 72340   1   1 70185   1   1 72830   1   1 69880  10   1     0   0   0
50 1.442375e+18  50 70910   2   1 72235   4   1 70905   1   1 72240   2   1 70730   1   1 72340   1   1 70185   1   1 72830   1   1 69880  10   1     0   0   0 

基本上,我试图逐列将每一行(i)与之前的(i-1)行进行比较。因此,如果 (i) 中的值与 (i-1) 中的值不匹配,我想根据值是增加还是减少来移动 j 或 k。然后一旦它到达 j 或 k 的末尾,增加 i 并从顶部开始。

如果您有量化背景。我试图捕捉订单簿的新订单/取消和修改。这可能有助于理解这个问题。每一行与之前的相比只有一个变化,我需要弄清楚变化是什么。

【问题讨论】:

你有一些样本数据给我们吗?这将有助于我们更容易理解您的问题。 我仍然对您的问题感到有些困惑,但是根据我的阅读,您希望将每一行与其上方的行进行比较,然后您想要遍历整个数据框。我对 j 和 k 在做什么感到困惑。这条线if(bidside[i,j] == bidside[i-1,k) 不会做任何事情,所以我不确定你要做什么。你能再解释一下吗? 你为什么说它不会做任何事情?我的逻辑错了吗? j 将遍历我当前正在查看的行的列,即 i k 将遍历与 i 比较的行的列,即 i-1 【参考方案1】:
# Assuming i = 1:3, j = 1:3, k= 1:2

# Your values would increment in the order below:
   i       j        k
   1       1        1
   1       1        2
   1       2        1
   1       2        2
   1       3        1
   1       3        2
   2       1        1
   2       1        2
   2       2        1
   2       2        2
   2       3        1
   2       3        2
   3       1        1
   3       1        2
   3       2        1
   3       2        2
   3       3        1
   3       3        2

首先你的 k 循环应该为当前 i 和 j 完成,然后 j 循环会增加,然后 i 循环。 内部循环首先递增,然后是外部循环,然后是最外部循环。

【讨论】:

好的,那么我的逻辑是完全错误的,因为这不是我想要的。我希望 j 和 k 为相等(==)条件同时增加,k 为大于(>)条件而增加,j 为小于(

以上是关于递增循环是 R 中三重嵌套循环的正确方式的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 中嵌套 foreach 循环的内循环和外循环之间添加代码

使用 foreach 函数和 doParallel 库在 R 中嵌套 for 循环

双重循环的嵌套执行原理

如何根据嵌套循环中的多个变量报告进度(对于进度条)?

三个嵌套 for 循环的时间复杂度

嵌套循环中未正确忽略内部循环的 Pragma omp parallel