【问题标题】:How to vectorize from if to ifelse with multiple statements?如何使用多个语句从 if 向量化到 ifelse?
【发布时间】:2017-10-13 11:28:21
【问题描述】:

我刚刚读到矢量化提高了性能并显着降低了计算时间,在 if() else 的情况下,最好的选择是 ifelse()。

我的问题是我在 for 循环中有一些 if 语句,每个 if 语句都包含多个赋值,如下所示:

x <- matrix(1:10,10,3)

criteria <- matrix(c(1,1,1,0,1,0,0,1,0,0,
                     1,1,1,1,1,0,0,1,1,0,
                     1,1,1,1,1,1,1,1,1,1),10,3) #criteria for the ifs
output1 <- rep(list(NA),10) #storage list for output
for (i in 1:10) {
  if (criteria[i,1]>=1) {
    output1[[i]] <- colMeans(x)
    output1[[i]] <- output1[[i]][1] #part of the somefunction output
  } else { 
    if(criteria[i,2]>=1) {
      output1[[i]] <- colSums(x)
      output1[[i]] <- output1[[i]][1] #the same
    } else {
      output1[[i]] <- colSums(x+1)
      output1[[i]] <- output1[[i]][1] #the same
    }}}

如何将其翻译成 ifelse?

提前致谢!

【问题讨论】:

标签: r for-loop if-statement


【解决方案1】:

请注意,您不需要 for 循环,因为使用的所有操作都是矢量化的:

output2 <- ifelse(criteria[, 1] >= 1, 
             colMeans(x)[1], 
             ifelse(criteria[, 2] >= 1, 
               colSums(x)[1], 
               colSums(x+1)[1]))

identical(output1, as.list(output2))
## [1] TRUE

【讨论】:

    【解决方案2】:

    至少您可以将两个作业合二为一。所以不是

    output[[i]] <- somefunction(arg1,arg2,...)
    output[[i]] <- output[[i]]$thing #part of the somefunction output
    

    你可以直接参考你唯一感兴趣的部分。

    output[[i]] <- somefunction(arg1,arg2,...)$thing #part of the somefunction output
    

    希望对你有帮助!

    【讨论】:

      【解决方案3】:

      似乎我在尝试构建示例时找到了答案:

          output2 <- rep(list(NA),10) #storage list for output
          for (i in 1:10) {
        output2[[i]] <- ifelse(criteria[i,1]>=1,
                              yes=colMeans(x)[1],
                              no=ifelse(criteria[i,2]>=1,
                                        yes=colSums(x)[1],
                                        no=colSums(x+1)[1]))}
      

      【讨论】:

        猜你喜欢
        • 2017-10-15
        • 1970-01-01
        • 1970-01-01
        • 2020-04-10
        • 1970-01-01
        • 1970-01-01
        • 2017-10-11
        • 1970-01-01
        • 2020-03-15
        相关资源
        最近更新 更多