我正在将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
}
答案 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