递增循环是 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 循环的内循环和外循环之间添加代码