2013-07-21 46 views
3
data<- c(100,101,102,103,104,99,98,97,94,93,103,90,104,105,110) 
date<- Sys.Date()-15:1 
file<- xts(data,date) 
colnames(file)<- "CLOSE" 
file$high<- cummax(file$CLOSE) 
file$trade <- 0 
file$trade[file$high*.95>=file$CLOSE] <- 1 
file$trade[file$high*.90>=file$CLOSE] <- 2 
file$trade[file$high*.85>=file$CLOSE] <- 3 

file 
     CLOSE high trade 
2013-07-06 100 100  0 
2013-07-07 101 101  0 
2013-07-08 102 102  0 
2013-07-09 103 103  0 
2013-07-10 104 104  0 
2013-07-11 99 104  0 
2013-07-12 98 104  1 
2013-07-13 97 104  1 
2013-07-14 94 104  1 
2013-07-15 93 104  2 
2013-07-16 103 104  0 
2013-07-17 90 104  2 
2013-07-18 104 104  0 
2013-07-19 105 105  0 
2013-07-20 110 110  0 

我需要修改交易欄,等以後我得到我的第一個「1」,則所有元素將是零,直到我得到2,然後將所有的元素應該是0,直到我得到3等等。循環在列的條件只有一次

回答

2

我想,你可以簡單地做:

> file$trade[duplicated(file$trade)] <- 0 
+0

如果我需要的文件$貿易[文件$ *高0.90> =文件$ CLOSE < - 1也即每5低於高位欄的百分比(接近<高位)我需要交易給我1。 –

2

你不需要一個循環來做到這一點。事實上,你只需要找到第一個「1」,「2」,......的位置。嘗試下面的代碼。

rank.trade <- rank(file$trade, ties.method = "first") 
marks <- cumsum(head(table(file$trade), -1)) + 1 
black.list <- is.na(match(rank.trade, marks)) 
file$trade[black.list] <- 0