r - 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))
解决方案
而不是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
推荐阅读
- apk - 如何使用 Tizen Studio 将 APK 转换为 TPK
- javascript - Javascript:您将如何创建一个可以通过沿轴滑动节点来修改的 blob
- arrays - Laravel 雄辩,其中定义的值介于数据库中的 json 范围值之间
- php - 搜索栏的多个字段不起作用
- reactjs - 我应该通过 Id 从 API 获取还是过滤获取的数据
- html - 为什么该函数在我的每个组件中运行两次
- c++ - C++ - 为什么这种使用地图的斐波那契记忆的实现如此缓慢?
- r - 如何将标题添加到多个列
- string - “换行”和“换行”之间的技术区别?
- angular - 在 Rxjs 6 中重写 Rxjs 4