【问题标题】:Create column with multiple ifelse()创建具有多个 ifelse() 的列
【发布时间】:2013-07-19 15:21:28
【问题描述】:
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 &gt;= close,交易的结果应该是2。我不明白为什么 2013-07-14 和 2013-07-16 的交易列不等于 2。

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

【问题讨论】:

  • 结果是对的,如果 x*。 95

标签: r loops xts


【解决方案1】:

交易栏永远不会是 2,因为只要 file$high*.9&gt;=file$CLOSETRUEfile$high*.95&gt;=file$CLOSE 也是 TRUE 并且您的第一个 ifelse 呼叫永远不会是 FALSE

改为这样做:

file$trade <- 0
file$trade[file$high*.95>=file$CLOSE] <- 1
file$trade[file$high*.90>=file$CLOSE] <- 2

【讨论】:

  • 我可以在贸易列中做点什么,在我得到第一个 1 之后,所有元素都将为零,直到我得到 2,
  • @AshishJalan 那应该是另一个问题,有自己的样本数据:-)
【解决方案2】:

为了清晰起见,我认为我更喜欢 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))

附:可能使用 ifelse 会更快(当分解为三行时,所有“2”都设置为第一个 0,然后设置为 2 之前的 1)。在您的“2”结果相对不常见的情况下,我确信差异太小而无法进行基准测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 2011-10-12
    相关资源
    最近更新 更多