如何在1 if语句中处理多个条件?

时间:2018-12-21 15:57:02

标签: r if-statement

我正在将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 :(得分:1)

使用&&(有关其他逻辑运算符,请参见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
}

如果所有四个比较都为true,则if语句将返回true。

ifelse函数可能有助于您加速代码,因为它有助于向量化比较。

答案 1 :(得分:1)

以下方法似乎更复杂,但更灵活。它首先获取以模式"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