使用多个ifelse()创建列 require(xts) 数据

使用多个ifelse()创建列 require(xts) 数据,r,loops,xts,R,Loops,Xts,交易列从不为2,因为无论何时file$high*.9>=file$CLOSE为TRUE,file$high*.95>=file$CLOSE也为TRUE,您的第一次ifelse调用从不为FALSE 改为这样做: require(xts) 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

交易列从不为2,因为无论何时
file$high*.9>=file$CLOSE
TRUE
file$high*.95>=file$CLOSE
也为
TRUE
,您的第一次
ifelse
调用从不为
FALSE

改为这样做:

require(xts)

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<- ifelse(file$high*.95>=file$CLOSE, 1,ifelse(file$high*.9>=file$CLOSE, 2,0))
file

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

file$trade=file$CLOSE]=file$CLOSE]为了清晰起见,我更喜欢Joshua的方法,但是修复
ifelse
子句的方法是围绕测试交换。因此,改变这一点:

file$trade <- 0
file$trade[file$high*.95>=file$CLOSE] <- 1
file$trade[file$high*.90>=file$CLOSE] <- 2
file$trade=file$CLOSE,1,ifelse(file$high*.9>=file$CLOSE,2,0))
为此:

file$trade<- ifelse(file$high*.95>=file$CLOSE, 1,ifelse(file$high*.9>=file$CLOSE, 2,0))
file$trade=file$CLOSE,2,ifelse(file$high*.95>=file$CLOSE,1,0))

另外,使用ifelse可能更快(当分解为三行时,所有“2”在设置为2之前先设置为0,然后设置为1)。在你的例子中,“2”的结果相对较少,我确信差异太小,无法进行基准测试。

我可以对交易栏做些什么吗,在我得到第一个1之后,所有元素都将为零,直到我得到2,@AshishJalan,这应该是另一个问题,有它自己的样本数据:-)结果是正确的,如果x*。95
file$trade<- ifelse(file$high*.90>=file$CLOSE, 2,ifelse(file$high*.95>=file$CLOSE, 1,0))