3

我有一个关于在 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 + 随机数等。

我必须如何修改我的代码才能获得上述结果?

先感谢您!

4

3 回答 3

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)
  }
}
于 2013-02-10T11:38:44.320 回答
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将它们放入一个数据结构中。

于 2013-02-10T11:39:21.373 回答
1

rnorm采用向量作为mean参数,可用于直接计算矩阵值:

按列:

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

行大小:

matrix(rnorm(n=50*10*length(mu), mean=rep(mu, each=10)), nrow=50, byrow=TRUE)
于 2013-02-10T22:40:33.467 回答