在我的智慧结束时,很抱歉这是错误的地方,或做错了。第一次问这里。我是R的新手,只有极少的编程经验(大学里的pascal课程,并且非常擅长宏观媒体术语 - 所以,不要害怕代码)。
为了简单而简单,我认为最好只是告诉你我拥有什么,以及我想要什么。我花了几个小时搜索并尝试解决方案。
我所拥有的一个例子(它是一个名为“signals”的xts对象,并以天为索引(这里省略了以使示例变得简单):
open close position
0 0 0
1 0 0
0 0 0
0 0 0
0 1 0
0 0 0
以及我想要发生的事情:
open close position
0 0 0
1 0 1
0 0 1
0 0 1
0 1 1
0 0 0
基本上,当“打开”为真时,在“位置”重复1,直到“关闭”为真。我认为,非常简单,但不知何故,我无法使其发挥作用。在这里我得到的一个例子我认为可能很接近,但它陷入了无休止的循环:
for (i in 1:nrow(signals)) {
if (signals[i,"open"]==1) next
while (signals[i,"close"] == 0) {
signals[i,"position"] <- 1 }
}
谢谢你!
编辑 - 我遗漏了一个重要的资格赛。有些时候,“关闭”中的第一个真实陈述将出现在“开放”中的第一个真实陈述之前。但是,既然我在这里写了这篇文章,我认为以某种方式“关闭”关闭列更容易,所以在开放列中第一个1点之前没有1。
然而,如果有人知道如何做到这一切,请随时添加其他信息。谢谢!
答案 0 :(得分:7)
您不必为此使用循环:
open <- c(0,1,0,0,0,0)
close <- c(0,0,0,0,1,0)
position <- cumsum(open-close)
position
[1] 0 1 1 1 0 0
请注意,这会立即关闭,如果您想在收到关闭信号后在线,请使用:
cumsum(open-c(0,close[-length(close)]))
[1] 0 1 1 1 1 0
您的while
声明永远不会结束的原因是您无需修改正在测试的内容,即i
不会增加。