2017-10-13 58 views
0

我剛剛看到矢量化提高了性能,並大大降低了計算時間,在if()else的情況下,最佳選擇是ifelse()。如何使用if語句向多個語句進行矢量化?

我的問題是我得到了一些if語句裏面一個for循環,每個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呢?

在此先感謝!

+0

請仔細閱讀[MCVE ] –

+0

謝謝!審查和更新 –

回答

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 

希望它可以幫助!

+1

謝謝!它絕對有幫助 –

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