r - 如何在时间序列数据中用 R 表示“IFELSE”?
问题描述
如何使用“if else”来处理以下逻辑?
ifelse(HIGH(yesterday)= CLOSE(yesterday)> OPEN(yesterday)> LOW(yesterday)
& HIGH (today) = OPEN(today) = CLOSE(today) > LOW(today), 1, 0)
给数据集A
A <- data.frame(
OPEN = c(4.58, 5.00, 5.32, 4.93, 5.72, 6.65,6.80),
HIGH = c(5.00, 5.00, 5.32,5.57, 6.65, 6.90, 6.80),
LOW = c(4.58, 5.00, 5.14, 4.93, 5.72, 6.00, 6.80),
CLOSE = c(5.00, 5.00,5.29,5.57, 6.65, 6.00, 6.80)).
我已经试过了
ifelse(HIGH(t-1)= CLOSE(t-1)> OPEN(t-1)> LOW(t-1) & HIGH (t) = OPEN(t) =CLOSE(t) > LOW(t), 1, 0)
谢谢
解决方案
请注意,根据您的示例数据,该ifelse(...)
语句始终返回0
,因此也许您应该仔细检查您的逻辑和/或提供更好和更具代表性的示例数据。
另请注意,这里不需要明确的ifelse
条件;使用一元运算符+
(或as.integer
)将逻辑向量转换为1
/会更快0
。
一般来说,这可以使用dplyr::lag
.
library(dplyr)
A %>%
mutate(flag =
+(lag(HIGH) == lag(CLOSE) &
lag(CLOSE) > lag(OPEN) &
lag(OPEN) > lag(LOW) &
HIGH == OPEN &
OPEN == CLOSE &
CLOSE > LOW))
# OPEN HIGH LOW CLOSE flag
#1 4.58 5.00 4.58 5.00 0
#2 5.00 5.00 5.00 5.00 0
#3 5.32 5.32 5.14 5.29 0
#4 4.93 5.57 4.93 5.57 0
#5 5.72 6.65 5.72 6.65 0
#6 6.65 6.90 6.00 6.00 0
#7 6.80 6.80 6.80 6.80 0
推荐阅读
- javascript - 无法将对象作为参数传递给 javascript 函数
- matlab - 在使用 Runge-Kutta 4 阶的解决方案中使用函数定义外的插值
- javascript - 如何从 json 数组中渲染表格?
- dictionary - 如何将 Cassandra 中的映射列转换为以键为列名、以值作为列值的记录?
- javascript - 如何手动触发提交功能?
- javascript - 通过 id 更新对象中的 MongoDB 对象
- html - HTML:如何用逗号打开锚标记 URL?
- c# - 如何以毫秒为单位获得时间跨度
- python - 我需要帮助使用字典 python 字典
- java - 如何以 GMT 格式打印日期?