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がtrueのとき、closeがtrueになるまでpositionに1を繰り返します。驚くほど単純だと思いますが、どういうわけか機能させることができません。ここで、おそらく近いと思った場所の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 はありません。

ただし、誰かがそれをすべて行う方法を知っている場合は、遠慮なく追加情報を追加してください。ありがとう!

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 に答える