我有一个关于在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 +随机数等。
如何修改我的代码以获得上述结果?
提前谢谢!
答案 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)
rnorm
为mean
参数提取了一个向量,可用于直接计算矩阵值:
逐列:
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)