2014-05-25 67 views
2

我正在運行一個實驗。我從1號到6號抽樣,我做了3次。在實驗的每次運行中,我執行一些邏輯來獲得「主要」向量。然後我重複實驗5次。我的代碼是:如何優化我的代碼,因此不使用循環

main<- vector("numeric",5) 

for (i in 1:5) 
{ 
    s<-sample(c(1,2,3,4,5,6), 3, replace = FALSE) 
    print(s) 
    if(s[1]>3) 
    { 
     main[i]<-s[1] 
     }else 
    { 
     if(s[2]>3) 
     { 
     main[i]<-s[2] 
     } 
     else 
     { 
     main[i]<-s[3] 
     } 
    } 
} 

print(main) 

當您運行,你會看到類似:

[1] 5 1 2 
[1] 5 2 1 
[1] 6 1 4 
[1] 3 4 1 
[1] 2 5 1 

> print(main) 
[1] 5 5 6 4 5 

主要載體產生按照以下規則:

  1. 如果的第1個要素向量> 3,那麼結果是第一個元素
  2. 如果向量的第一個元素是< 3並且第二個元素大於3,那麼結果是t他第二個元素
  3. 否則結果是3元

我想知道有沒有更簡潔,矢量化,更高效的這樣的方式?使用vecotors而不是循環和if語句等...

謝謝。

+1

嘗試使用'ifelse' ... –

+0

應該在CodeReview而不是StackOverflow上詢問代碼優化問題http://codereview.stackexchange.com/ –

回答

3

如下我將重寫代碼:

replicate(5, { 
    s<-sample(c(1,2,3,4,5,6), 3, replace = FALSE) 
    s[c(which(s[1:2] > 3), 3)[1]] # return 1st, 2nd or 3rd element 
}) 

c(which(s[1:2] > 3), 3)[1]返回1,如果s[1] > 3,2如果s[2] > 3,並3否則。 因此,s[c(...)[1]]相應地選擇第一,第二或第三元素。

+0

謝謝!你能解釋一下這條線:s [c(which(s [1:2]> 3),3)[1]]? – user3022875

+0

@ user3022875:我做了一個編輯 – gagolews