使用多个ifelse()创建列

时间:2013-07-20 10:38:30

标签: r loops xts

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

我给出的交易栏命令是.90*column high >= close时,交易结果应为2。我不明白为什么贸易专栏在2013-07-14和2013-07-16不等于2。

我已经得到了上述问题的答案。我的实际问题是别的。我以为我会做研究并完成它但仍然存在问题。 我需要交易栏给我+ 1或-1每次收盘时下跌5%,10%,15%......从高位开始,如果再收盘价再次收盘价上涨10%,它应该给我 - 1。 当我们在任何给定日期添加+1和-1时,它不应该是-ve或大于5.

2 个答案:

答案 0 :(得分:3)

我认为我更倾向于Joshua的方法,但修复ifelse条款的方法是交换测试。所以改变这个:

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

到此:

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

P.S。潜在地使用ifelse更快(当分成三行时,所有“2”被设置为第一个0然后是1,然后被设置为2)。在您的情况下,“2”结果相对较少,我确信差异太小而无法进行基准测试。

答案 1 :(得分:2)

交易列永远不会是2,因为只要file$high*.9>=file$CLOSETRUEfile$high*.95>=file$CLOSE也是TRUE,而您的第一个ifelse来电永远不会{{1} }。

做这样的事情:

FALSE