使用apply()代替for循环

时间:2017-11-07 00:53:26

标签: r

所以我有这个循环:

set.seed(11)
k=10000  # replicates
n=100    # sample size of each replication
t.mean = 0 # initialize vector of trimmed means 
for(i in 1:k){
  dat=rnorm(n)
  t.mean[i]=mean(dat,trim=.05)
}
mean(t.mean)
var(t.mean)

我试图用apply()函数替换for循环中涉及的代码

我认为这样可行

set.seed = 11
k = 10000
n = 100
t.mean = 0
dat  = rnorm(n)
dat = as.data.frame(dat)
t.mean =apply(dat,c(1,2), mean,trim=.05)
mean(t.mean)
var(t.mean)

然而,我没有得到与以前相同的值,并且它们不像前面使用for循环的情况一样保持不变。当我使用申请时,我究竟做错了什么?

1 个答案:

答案 0 :(得分:2)

此处replicate()功能可能更有用

set.seed(11)
out <- replicate(10, mean(rnorm(100), trim = 0.05))

k <- 10给出

> mean(out)
[1] 0.007134792
> var(out)
[1] 0.009029396

与您为同一for显示的k循环相匹配。

如果您想使用apply(),另一种选择是生成整个随机正常值集合,按k列矩阵排列为100行,然后{对该矩阵的列{1}} apply()。例如

mean()

与上述内容以及set.seed(11) rnd <- matrix(rnorm(100*k), ncol = k) out2 <- apply(rnd, 2L, mean, trim = 0.05) 循环

相同
for()

第二条路线的一个优点是您拨打> mean(out2) [1] 0.007134792 > var(out2) [1] 0.009029396 一次而不是rnorm()次。