在我的智慧结束时,很抱歉这是错误的地方,或者做错了。第一次在这里问。我是 R 的新手,几乎没有编程经验(大学里的 pascal 类(class),并且非常擅长使用宏媒体行话——所以,不怕代码)。
为了让事情简短而简单,我认为最好只向您展示我拥有的以及我想要的。我花了几个小时来搜索和尝试解决方案。
我所拥有的示例(它是一个名为“信号”的 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 }
}
谢谢你!
编辑 - 我遗漏了一个重要的限定词。有时,“close”中的第一个真语句会出现在“open”中的第一个真语句之前。但是,既然我在这里写了这些,我想以某种方式“清理”关闭列会更容易,因此在打开列中的第一个 1 点之前,其中没有 1。
但是,如果有人知道如何完成所有操作,请随时添加其他信息。谢谢!
最佳答案
您不必为此使用循环:
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
不会增加。
关于r - 在 R 中执行直到循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15832389/