这是我的系列文章“如何避免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")