循环列 - 条件只有一次

时间:2013-07-21 05:56:16

标签: r loops

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 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

我想,你可以这样做:

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