【问题标题】:Optimise code for a simple monte carlo like simulation为简单的类似蒙特卡罗的模拟优化代码
【发布时间】:2017-07-26 07:59:12
【问题描述】:

我运行了以下有效但需要很长时间的代码,我确信有一种方法可以更快地获得相同的结果。

runs <- 1000
prediction <- runif(77,0,1)
n< - length(prediction)
df.all <- data.frame(Preds = rep(prediction, runs),
                     simno=rep(1:runs,each=n))

for (x in 1:runs) {
  for (i in 1:length(df.all$Preds)){
    df.all$rand[i] <- sample(1:100,1)
    df.all$Win[i] <- ifelse(df.all$rand[i]<df.all$Preds[i]*100,1,0)
  }
}

df.all% >% group_by(simno) %>% summarise(Wins=sum(Win)) -> output

【问题讨论】:

    标签: r performance optimization


    【解决方案1】:

    这可以通过以下方式轻松矢量化:

    • 执行单个示例操作(不是附加的 replace = TRUE 参数。
    • 执行单个比较&gt;

    可以去掉里面的for循环来获取

    for (x in 1:runs) {
      df.all$rand = sample(1:100, size = length(prediction), replace=TRUE)
      df.all$Win = df.all$rand < df.all$Preds*100
    }
    

    然后您可以更进一步并删除该循环

    df.all$rand = sample(1:100, n = nrow(df.all), replace=TRUE)
    df.all$Win = df.all$rand < df.all$Preds*100
    

    【讨论】:

    • 您可以改用数据框列表,并在运行编号 x 中填写 df.all[[x]]$rand。在循环结束时,您可以使用 Reduce(rbind, df.all) 将它们全部绑定到一个大数据帧中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 1970-01-01
    • 2012-04-26
    • 2015-02-10
    • 1970-01-01
    相关资源
    最近更新 更多