【发布时间】:2016-04-15 02:51:29
【问题描述】:
我正在运行两个嵌套的 for 循环来检查向量的每一行,如果下面的 10 行中的任何一行的 3 点大于下面的 3 行。如果为真,则在新创建的二进制向量上记录 1。 (我知道这听起来很复杂,但是这种比较允许测试时间序列中的条件以用于交易目的)
例如,对于第一行,要检查是否:
- 第 2 行 > 第 5 行 + 3 或
-
第 3 行 > 第 6 行 + 3 或
...
第 11 行 > 第 14 行 + 3
(顺便说一句,我需要循环,想法是在数千行上运行它,而不仅仅是 20 行)
以下代码运行良好,但具有当循环之一超出向量时产生 NA 值的不良特性。
df <- data.frame( LastPrice = c( 1221, 1220, 1230, 1217, 1216, 1218 , 1216, 1216, 1217, 1220, 1219, 1218, 1220, 1216, 1217, 1218, 1218, 1207, 1206, 1205))
df$StrongMoveBinary[j] <- 0
for(j in 1:20) {
tmp <- 0
for (i in 1:10) {
tmp <- tmp + ifelse (df$LastPrice[j+i] - df$LastPrice[j+i+3] > 3, 1, 0)}
df$StrongMoveBinary[j] <- tmp>0}
//Note: purpose of tmp variable is to record every occasion that LastPrice > LastPrice 3 rows below, rather than just the last instance
该代码创建 StrongMoveBinary = 1 1 0 0 1 1 1 NA NA NA NA NA NA NA NA NA NA NA NA NA。那是13个NA。但是有足够的数据只有 4 个 NA。其他 9 个 NA 是我编码不佳的结果。为了解决这个问题,我修改了代码,在给定“j”值的情况下限制“i”的值,从而停止“i”循环以在向量外循环。
df$StrongMoveBinary[j] <- 0
for(j in 1:20) {
x <- 0
if (j <= 10) {x=10}
if (j > 10) {x=20-j}
tmp <- 0
for (i in 1:x) {
tmp <- tmp + ifelse (df$LastPrice[j+i] - df$LastPrice[j+i+3] > 3, 1, 0)}
df$StrongMoveBinary[j] <- tmp>0}
不幸的是,它不起作用。 StrongMoveBinary 仍然有 13 个 NA。任何想法将不胜感激!谢谢。
【问题讨论】:
-
因此,当您说“以下 10 行中的任何一行”时,它更像是“以下最多 10 行中的任何一行(如果行数不足,则更少)...... ” 对吗?因此,当我们到达第 16 行时,您检查第 17 行 > 第 20 行,然后对于第 17 行,
NA是正确的响应,是吗? -
没错!这就是我在修改后的代码中尝试的。对于第 18 行,NA 是正确的响应。第 17 行仍然可以计算。
-
如何计算第17行?在您的示例“对于第 1 行”中,比较从第 2 行 > 第 5 行到第 11 行 > 第 14 行。按照这种逻辑,“对于第 17 行”,我们将所有这些数字加 16,然后从第 18 行 > 第 21 行 不存在 得到——甚至不是第一次比较。请更正示例或评论。
-
你是对的。我之前的评论是错误的。第 17 到 20 行必须是 NA。谢谢!
-
最后一个问题。在您的代码中,您检查行之间的差异是否为
> 3。但是在您的文本中,您只需说“第 2 行大于第 5 行”。您是否关心第 2 行是否大于第 5 行,或者第 5 行 - 第 2 行 > 3?
标签: r for-loop nested-loops trading