使用向量而不是for来填充多条件布尔R.

时间:2014-03-14 17:41:07

标签: r for-loop boolean zoo

这是我的系列文章“如何避免R中的循环”中的最新内容。我想在某些时候,我会得到它。

下面是代码,为了这个例子,只需使用Strikes = 530运行它。没有必要测试所有其他代码并担心GetStrikesForDay函数。

TargetStrikes <- function(data, StrikeIncrement=2.50)
{
  epsilon = 0.10

  Strikes = GetStrikesForDay(data, StrikeIncrement)

  for (i in Strikes)
  {
    AtStrike <- abs(data$Close - i) <= epsilon
    data <- cbind.zoo (data, AtStrike)
    colnames(data)[length(colnames(data))] <- i
  }

  return(data)

}

正如其中所写,AtStrikes的工作非常精彩。它包含指定条件的所有True / False,数据中每行一个。我想补充另一个条件,但它失败了。

AtStrike <- abs(data$Close - i) <= epsilon || data$High>=i && data$Low <=i

Atstrike现在只有一个值,False,就是这样。我不再得到一个很好的布尔列表,这就是我想要的。

我知道我可以遍历每一行,但我想避免这种情况。做这个的最好方式是什么?现在,我无处可去。我尝试了各种各样的组合而没有运气。

9:38应该是真的,基于高于530且低低于或等于530

这是数据,

                      Open   High    Low  Close
2014-03-07 09:35:00 530.33 530.91 530.25 530.36
2014-03-07 09:36:00 530.54 530.98 530.37 530.73
2014-03-07 09:37:00 530.61 531.33 530.60 531.18
2014-03-07 09:38:00 531.19 531.25 530.00 530.19
2014-03-07 09:39:00 530.30 530.30 529.31 529.78
2014-03-07 09:40:00 529.71 529.89 529.32 529.59

以下是我希望它在运行循环/语句后的样子:

                      Open   High    Low  Close AtStrike
2014-03-07 09:35:00 530.33 530.91 530.25 530.36 FALSE
2014-03-07 09:36:00 530.54 530.98 530.37 530.73 FALSE
2014-03-07 09:37:00 530.61 531.33 530.60 531.18 FALSE
2014-03-07 09:38:00 531.19 531.25 530.00 530.19 TRUE
2014-03-07 09:39:00 530.30 530.30 529.31 529.78 FALSE
2014-03-07 09:40:00 529.71 529.89 529.32 529.59 FALSE

进入R,

structure(c(530.33, 530.54, 530.61, 531.19, 530.3, 529.71, 530.91, 
530.98, 531.33, 531.25, 530.3, 529.89, 530.25, 530.37, 530.6, 
530, 529.31, 529.32, 530.36, 530.73, 531.18, 530.19, 529.78, 
529.59), .Dim = c(6L, 4L), .Dimnames = list(NULL, c("Open", "High", 
"Low", "Close")), index = structure(c(1394202900, 1394202960, 
1394203020, 1394203080, 1394203140, 1394203200), class = c("POSIXct", 
"POSIXt"), tzone = ""), class = "zoo")

0 个答案:

没有答案