R Double For Loop

时间:2013-02-10 11:03:23

标签: r loops double

我有一个关于在R中进行双循环的明显问题,但在本网站上找不到答案。我使用以下代码:

mu <- c(0, .2, .5, .8)
sco <- matrix(nrow = 50, ncol = 4*10)

for (mu in mus) {
  for (i in 1:10) {
    sco[ ,i] <- mu + rnorm(n = 50, mean = 0, sd = 1)
  }
}

我现在得到10列mu +随机数,但我想得的是40列,其中前10列代表mu是0 +随机数,列11到20代表0.2 +随机数等。

如何修改我的代码以获得上述结果?

提前谢谢!

3 个答案:

答案 0 :(得分:4)

是不是所有列的方差都相同?为什么不用50 * 40标准普通随机数创建矩阵,然后在前十列中添加0,在下一十列中添加0.2,依此类推?!

编辑:

示例如下:

result <- matrix(rnorm(50*40,mean=0,sd=1),ncol=40)
mu <- c(rep(0,10),rep(10,10),rep(20,10),rep(30,10))

result <- t(t(result) + mu)

我忘了如何按列添加向量,因此使用2个转置进行丑陋的工作......我为mu选择了不同的值以使结果更清晰。

循环解决方案看起来像这样(虽然我不会使用这段代码,但你要求它......)

mus <- c(0, 10, 20, 30)
sco <- matrix(nrow = 50, ncol = 4*10)

for (mu in 1:4) {
  for (i in 1:10) {
    sco[ ,i+(mu-1)*10] <- mus[mu] + rnorm(n = 50, mean = 0, sd = 1)
  }
}

答案 1 :(得分:2)

我会做类似的事情:

return_numbers = function(mu_value) {
     matrix(mu_value + rnorm(50 * 10), 50, 10)
  }
dat = do.call("cbind", lapply(mu, return_numbers))

并完全跳过for循环。我通过一次生成前十行的所有数字跳过第一个循环,然后将矢量调整为矩阵。我跳过第二个循环,使用lapply循环mu值。最后,我使用cbind将它们放入一个数据结构中。

答案 2 :(得分:1)

rnormmean参数提取了一个向量,可用于直接计算矩阵值:

逐列:

matrix(rnorm(n=50*10*length(mu), mean=rep(mu, each=50*10)), nrow=50)

行-wize:

matrix(rnorm(n=50*10*length(mu), mean=rep(mu, each=10)), nrow=50, byrow=TRUE)