如何使用多个语句从if到ifelse进行向量化?

时间:2017-10-13 11:28:21

标签: r for-loop if-statement

我刚刚读到,矢量化可以提高性能并显着降低计算时间,而在if()的情况下,最好的选择是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?

提前致谢!

3 个答案:

答案 0 :(得分:2)

请注意,您不需要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

答案 1 :(得分:0)

至少可以将两个作业转换为一个。而不是

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

希望它有所帮助!

答案 2 :(得分:0)

我似乎找到了试图构建示例的答案:

    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]))}