如何优化我的代码所以不使用循环

时间:2014-05-25 17:07:25

标签: r for-loop

我正在进行一项实验。我从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. 如果向量的第一个元素是> 3,则结果是第一个元素
  2. 如果向量的第一个元素是&lt; 3并且第二个元素是&gt; 3则结果是第二个元素
  3. 否则结果是第3个元素
  4. 我想知道有更简洁,更有效,更有效的方法吗?使用vecotors而不是循环和if语句等...

    谢谢。

1 个答案:

答案 0 :(得分: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]如果s[1] > 3则返回1,如果s[2] > 3则返回2,否则返回3。 因此,s[c(...)[1]]会相应地选择第一个,第二个或第三个元素。