【问题标题】:Vectorize ifelse command in R在 R 中矢量化 ifelse 命令
【发布时间】:2015-01-13 05:36:37
【问题描述】:

我有这个示例数据

    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,则返回第一个 else 条件(并且不关心另一个条件是否为 TRUE,它能够执行第一个代码) 任何简单的如何实现它?我有一个巨大的数据集,所以每毫秒都可以保存。谢谢

【问题讨论】:

标签: r if-statement vectorization


【解决方案1】:

这是一个示例,您可以在没有任何ifelses 的情况下解决该问题。假设你 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 个嵌套 ifelses 的初始方法快很多。

更新

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

m[cbind(seq_len(nrow(m)), indx)]
# [1] 5 2 2 4 3 4 5 2 4 3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 2016-05-30
    • 1970-01-01
    • 2018-10-01
    • 2020-05-03
    • 1970-01-01
    相关资源
    最近更新 更多