4

在我的智慧尽头,很抱歉这是错误的地方,或者做错了。第一次在这里问。我是 R 新手,几乎没有编程经验(大学里的帕斯卡课程,并且很擅长宏媒体术语 - 所以,不那么害怕代码)。

为了让事情简短明了,我认为最好只是向您展示我拥有的东西,以及我想要的东西。我花了几个小时寻找和尝试解决方案。

我所拥有的一个示例(它是一个名为“信号”的 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

基本上,当“open”为真时,在“position”重复1s,直到“close”为真。我认为非常简单,但不知何故我无法让它工作。这里有一个我认为可能很接近的例子,但它陷入了无限循环:

for (i in 1:nrow(signals)) {
  if (signals[i,"open"]==1) next
  while (signals[i,"close"] == 0) {
    signals[i,"position"] <- 1 }
}

谢谢你!

编辑 - 我遗漏了一个重要的限定词。有时,“close”中的第一个真实陈述会出现在“open”中的第一个真实陈述之前。但是,既然我在这里写了这个,我想以某种方式“清理”关闭列会更容易,所以在打开列中的第一个 1 点之前没有 1。

但是,如果有人知道如何做这一切,请随时添加其他信息。谢谢!

4

1 回答 1

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不会增加。

于 2013-04-05T11:16:30.013 回答