首页 > 解决方案 > ifelse 函数而不是 for 循环

问题描述

我有如下的原始 R 代码。

 Bernoulli <- rbinom(1000, 1, 0.5)
 mix.sample <- rep(0, 1000)  #reserve storage
 for (i in 1:1000) { #for each Bernoulli realization
   if (Bernoulli[i] == 1){ #sample corresponding normal component
     mix.sample[i] <- rnorm(1, mean=10, sd=1)
   }
   else {
     mix.sample[i] <- rnorm(1, mean=0, sd=1)
   }
 }
 plot(density(mix.sample))

我尝试了以下代码而不是 for 循环,但生成的结果似乎有问题,有人可以帮我吗?

 Bernorm <- ifelse(Bernoulli == 1, rnorm(1, mean=10, sd=1), rnorm(1, mean=0, sd=1))

标签: rfor-loopif-statement

解决方案


而不是for你可以做的循环

set.seed(42)
sim.fun <- function(x) {
  if (x == 1) {
    rnorm(1, 10, 1)
  } else {
    rnorm(1, 0, 1)
  }
}

P <- sapply(Bernoulli, sim.fun)
plot(density(P))

或者,如果您依赖ifelse()使用它sapply()

P <- sapply(Bernoulli, function(x) ifelse(x == 1, rnorm(1, 10, 1), rnorm(1, 0, 1)))

该功能虽然更快。

microbenchmark()产量:

Unit: milliseconds
    expr      min       lq     mean   median       uq      max neval cld
for-loop 8.015976 8.232972 8.712522 8.316147 8.475865 14.65216   100   c
 sim.fun 3.622982 3.672990 4.493131 3.700290 3.752339 54.14139   100 a  
  sapply 5.932761 6.016319 6.479058 6.070026 6.115951 12.38065   100  b 

推荐阅读