首页 > 解决方案 > 如何在时间序列数据中用 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)

谢谢

标签: r

解决方案


请注意,根据您的示例数据,该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

推荐阅读