Как выразить "IFELSE" с R в данных временных рядов? - PullRequest
0 голосов
/ 28 августа 2018

Как использовать '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)

спасибо

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Выпуски:

  • R не знает, искать в вашем фрейме данных, чтобы найти HIGH. Вы должны сказать ему, что HIGH - это столбец кадра данных A, выполнив это: A$HIGH (есть несколько способов сделать это, используя квадратные скобки, если вам не нравятся знаки доллара). Аналогично для всех остальных ваших столбцов.
  • Круглые скобки не используются для индексирования столбцов данных.
  • R не знает, что такое t.
  • Тестирование равенства с оператором использует == вместо =.

Кроме того, вы можете упростить ifelse(a>b, 1, 0) до a>b.

ОК, чтобы найти решение, мне нравится использовать shift из пакета data.table для лагов / отведений, и я назвал ваш фрейм данных df:

library(data.table)

result <- shift(df$HIGH) == shift(df$CLOSE) &
          shift(df$CLOSE) > shift(df$OPEN) &
          shift(df$OPEN)  > shift(df$LOW) &
          df$HIGH == df$OPEN &
          df$OPEN == df$CLOSE &
          df$CLOSE > df$LOW

Обратите внимание, что с данными вашего примера результат всегда ложен.

Я также могу предложить немного прочитать об основном синтаксисе языка. Это может быть хорошим местом для начала.

0 голосов
/ 28 августа 2018

Обратите внимание, что на основе ваших выборочных данных оператор 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...