Как обрабатывать несколько условий в 1, если заявление? - PullRequest
0 голосов
/ 21 декабря 2018

Я сравниваю 20-дневную скользящую среднюю с 50-дневной, 100-дневной 200-дневной и 333-дневной.Условие, по сути, просто

if(20MA > 50MA > 100MA > 200MA > 333MA) {
  return TRUE
} else{
  FALSE
}

Есть ли способ в R справиться с этим без множественных вложенных операторов if?

if(tail(MA_20,n=1) > tail(MA_50,n=1) > tail(MA_100,n=1) > tail(MA_200,n=1) > tail(MA_333,n=1)) {
  score[1] <- 1
} else{
  score[1] <- -1
}

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Следующий способ кажется более сложным, но более гибким.Сначала извлекаются все переменные, названные по шаблону "MA_" и sapply tail, чтобы извлечь последний элемент.Затем использует diff, чтобы увидеть, находятся ли они в порядке убывания.

Сначала составьте некоторые данные.

library(zoo)

set.seed(1234)    # Reproducible results
n <- 1e3
x <- rnorm(n)

MA_20 <- rollmean(x, k = 20)
MA_50 <- rollmean(x, k = 50)
MA_100 <- rollmean(x, k = 100)
MA_333 <- rollmean(x, k = 333)

Теперь проблема.

score <- NULL

ma <- stringr::str_sort(ls(pattern = "^MA_"), numeric = TRUE)
MA_last <- sapply(ma, function(m) tail(get(m), n = 1))
score[1] <- if(all(diff(MA_last) > 0)) 1 else -1
0 голосов
/ 21 декабря 2018

Используйте && (см. help("&") для других логических операторов)

if (tail(MA_20,n=1) > tail(MA_50,n=1) &&
    tail(MA_50,n=1) > tail(MA_100,n=1) &&
    tail(MA_100,n=1) > tail(MA_200,n=1) &&
    tail(MA_200,n=1) > tail(MA_333,n=1)) {
    score[1] <- 1
} else {
    score[1] <- -1
}

Оператор if вернет true, если все четыре из этих сравнений верны.

ifelse функция может быть полезна для ускорения вашего кода, поскольку она помогает векторизовать сравнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...