从R中的xts对象子类化值时出现超出范围的错误

时间:2016-10-21 21:24:29

标签: r subset xts

我想基于另一个xts对象中的逻辑值来对xts对象的日期进行子集化,但是尽管有范围内的值,R仍会返回超出范围的错误。

例如,我想过滤RSI高于60的日期和价格。

> strength <- RSI(d, 14)>60
> strength["2016-10-17::"]
             RSI
2016-10-17  TRUE
2016-10-18  TRUE
2016-10-19  TRUE
2016-10-20 FALSE
2016-10-21 FALSE

> d["2016-10-17::"]
               Open
2016-10-17 642.2760
2016-10-18 640.5988
2016-10-19 637.0000
2016-10-20 631.9800
2016-10-21 633.6470

> d["2016-10-17::"][strength == TRUE]
Error in `[.xts`(d["2016-10-17::"], strength == TRUE) : 
  'i' or 'j' out of range

这不是我期望的输出,因为我的对象在2016-10-21之前都有数据。可能有什么不对?我想要像:

> d["2016-10-17::"][strength == TRUE]
               Open
2016-10-17 642.2760
2016-10-18 640.5988
2016-10-19 637.0000

这是我的xts对象的str

> str(d)
An ‘xts’ object on 2013-09-02/2016-10-21 containing:
  Data: num [1:1146, 1] 127 128 121 121 116 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr "Open"
  Indexed by objects of class: [Date] TZ: UTC
  xts Attributes:  
List of 2
 $ dateFormat: chr "Date"
 $ na.action :Class 'omit'  atomic [1:92] 1 2 3 4 5 6 7 8 9 10 ...
  .. ..- attr(*, "index")= num [1:92] 1.37e+09 1.37e+09 1.37e+09 1.37e+09 1.37e+09 ...

> str(strength)
An ‘xts’ object on 2013-09-16/2016-10-21 containing:
  Data: logi [1:1132, 1] FALSE FALSE FALSE FALSE FALSE FALSE ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr "RSI"
  Indexed by objects of class: [Date] TZ: UTC
  xts Attributes:  
 NULL
> 

谢谢

1 个答案:

答案 0 :(得分:2)

你没有制作一个可重复的例子,所以这里有一些玩具数据。您的问题是您没有使用相同的时间窗口强度子集(因此您的内部strength == TRUE逻辑系列的行长度与d行长不同,从而产生错误。即NROW(strength == TRUE)&gt ;&gt; NROW(d["2016-10-17::"])):

library(quantmod)
getSymbols("AAPL")
d <- AAPL
strength <- RSI(Cl(d)) > 60

如果你这样做,你不会得到错误:

d["2016-10-17::"][strength["2016-10-17::"] == TRUE]