在R中Vectorize ifelse命令

时间:2015-01-13 05:36:38

标签: r if-statement vectorization

我有这个示例数据

    library(quantmod)
    getSymbols("NOK",from="2013-01-01",to="2014-05-01",src="yahoo","getSymbols.warning4.0"=FALSE)
    data<-NOK
    w1<-1
    L_dO<-data[,1]
      L_dC<-data[,4]
      L_Profit_L_1<-((lag(L_dC,-1)-lag(L_dO,-1))/(lag(L_dO,-1)))*100
      L_Profit_L_2<-((lag(L_dC,-2)-lag(L_dO,-1))/(lag(L_dO,-1)))*100
      L_Profit_L_3<-((lag(L_dC,-3)-lag(L_dO,-1))/(lag(L_dO,-1)))*100
      L_Profit_L_4<-((lag(L_dC,-4)-lag(L_dO,-1))/(lag(L_dO,-1)))*100
      L_Profit_L_5<-((lag(L_dC,-5)-lag(L_dO,-1))/(lag(L_dO,-1)))*100
      L_Profit_L_all<-ifelse(L_Profit_L_1>w1,L_Profit_L_1,
                             ifelse(L_Profit_L_2>w1,L_Profit_L_2,
                                    ifelse(L_Profit_L_3>w1,L_Profit_L_3,
                                           ifelse(L_Profit_L_4>w1,L_Profit_L_4,
                                           ifelse(L_Profit_L_5>w1,L_Profit_L_5,L_Profit_L_5)))))

我感兴趣的是L_Profit_L_all,但是我觉得写这个有点奇怪而又缓慢。我试图像

那样对其进行矢量化
L_Profit_L_all<-ifelse(c(L_Profit_L_1>w1,L_Profit_L_2>w1,L_Profit_L_3>w1,L_Profit_L_4>w1,L_Profit_L_5>w1),c(L_Profit_L_1,L_Profit_L_2,L_Profit_L_3,L_Profit_L_4,L_Profit_L_5),L_Profit_L_5)

但结果却不一样。我希望它以正确的顺序工作,即如果第一个if条件为TRUE,则返回第一个其他条件(并且不关心另一个条件是否为TRUE,这能够执行第一个代码) 任何直截了当的如何实现呢?我有一个庞大的数据集,所以每个ms都可以保存。谢谢

1 个答案:

答案 0 :(得分:1)

以下是一个如何在没有任何ifelse的情况下解决问题的示例。假设您cbind将所有L_Profit_L_X向量组合在一起,以获得与我的示例中的m类似的内容。

set.seed(1)
m <- matrix(sample(-5:5, 50, T), ncol = 5)
indx <- max.col(m > 1, ties.method = "first")
sapply(seq_along(indx), function(i) m[i, indx[i]])
#[1] 5 2 2 4 3 4 5 2 4 3

由于我们使用的是sapply,因此未完全向量化,但我确信它会比使用5个嵌套ifelse的初始方法快得多。

更新

您可以通过将上面的sapply部分替换为:

来对代码进行矢量化
m[cbind(seq_len(nrow(m)), indx)]
# [1] 5 2 2 4 3 4 5 2 4 3