2013-04-05 28 views
3

,所以很抱歉,這是錯誤的地方,或不正確地完成。第一次在這裏問。我對R很陌生,只有很少的編程經驗(大學裏有一個pascal類,而且擅長使用macromedia的術語 - 所以不用擔心代碼)。做,直到我無計可施循環中的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 

基本上,當「開放」是真實的,重複1S在「位置」,直到「關」是真的非常簡單,我想,但不知何故,我不能讓它工作在這裏的一個例子。在那裏,我認爲可能是接近,但它陷入了一個無限循環:

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。

但是,如果有人有一個想法如何做到這一切,隨意添加附加信息。謝謝!

回答

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 

你的說法永遠不會結束的原因是你沒有任何東西可以修改正在測試的東西,也就是說i不會增加。

+0

哇,這讓我以完全不同的方式看待問題。它回答了原來的問題。先生,謝謝你的快速反應。我感到非常放心。 – 2013-04-05 11:28:32