最快的方法在R中构建这个ifelse循环

时间:2014-07-07 14:15:48

标签: r performance loops

我想做的是:

  1. 生成介于0和1之间的Randon数

    rand_number <- runif(1,0,1)
    
  2. 根据生成的randon数量,我将值1,2,3,4或5赋予变量 bet_choice

    bet_choice <- ifelse(rand_number<0.1,1,
                     ifelse(rand_number>0.1 & rand_number<=0.4,2,
                            ifelse(rand_number>0.4 & rand_number<=0.7,3,
                                   ifelse(rand_number>0.7 & rand_number<=0.9,4,5))))
    
  3. 我重复这个模拟1000次,我觉得使用ifelse不是实现这个目标的最佳方式。有没有办法避免ifelse循环并提高这部分代码的性能?

    如果有人对完整代码感兴趣,我会在(https://quant.stackexchange.com/questions/12868/kelly-capital-growth-investment-strategy-example-in-r)中提供完整的代码。

1 个答案:

答案 0 :(得分:2)

我赞成了josilber的答案,因为我认为这是非常好的。但我只是补充一点,你真的从一个特定的离散分布中采样,你使用均匀随机变量来选择具有正确概率的随机数。您可以使用sample通过以下方式获得相同的结果:

s <- sample(1:5, size = 1000, replace = TRUE, prob = c(0.1, 0.3, 0.3, 0.2, 0.1))

你可以自己测试一下,但我相信这应该更快。

编辑我现在使用以下内容对其进行了测试:

library(microbenchmark)
s1 <- function() sample(1:5, size = 1000, replace = TRUE, prob = c(.1,.3,.3,.2,.1))
s2 <- function() sample.int(5, size = 1000, replace = TRUE, prob = c(.1,.3,.3,.2,.1))
microbenchmark(s1(), s2())
#Unit: microseconds
# expr    min     lq median     uq    max neval
# s1() 39.389 40.536 41.300 41.683 76.483   100
# s2() 29.828 30.594 31.358 31.741 43.213   100

似乎sample.int速度更快,速度比josilber的version2提高了16.9倍。