将生成的数据以矩阵格式放置

时间:2014-10-28 23:22:14

标签: r simulation matrix

我有一个关于将模拟数据放入矩阵格式的问题,但是我不能在R中适当地编写它的程序,并且不断收到错误,我想我的" rep"定义和最终"矩阵"表达式有些不对,但我不知道如何修复它们。我的具体问题是:

我想生成一个包含生成值的矩阵。我有20000个生成的x和y值。作为输出,我喜欢有一个(2000×10)矩阵,矩阵的每列包含以下for循环的输出。

我的R.code:

x=rnorm(2e4,5,6)
vofdiv=quantile(x,probs=seq(0,1,0.1))
y=rnorm(2e4,4,6)
Matrix=rep(NULL,2000)
for(i in 1:10)
{
Matrix[i]=y[(x>=vofdiv[i] & x<vofdiv[i+1])]  #The i(th) col of matrix
}
Matrix   # A 2000*10 Matrix, as the final output

我非常感谢有人帮助我!

1 个答案:

答案 0 :(得分:3)

这里有几个问题。

首先,定义大小为2e4*10的空矩阵的正确方法是

Matrix <- matrix(NA, 2e4, 10)

虽然您可以使用自己的方式(rep)创建矩阵,然后使用dim,例如

Matrix <- rep(NA, 2e5)
dim(Matrix) <- c(2e4, 10)

第二个问题是,当您尝试插入matrix中的列时,您需要正确地对其进行索引,即

Matrix[, i] <-

而不是

Matrix[i] <- 

后者将索引Matrix,就好像它是一个向量(它基本上就是这样)。换句话说,它会将2000 * 10 matrix转换为20000长度单vector并将其编入索引。

第三个问题是,当你的循环达到i = 11并且你正在运行x<vofdiv[i+1]时,你总是排除x == vofdiv[11]的最后一个值,因此你总是得到少于2000的值值:

for(i in 1:10)
{
  print(length(y[ (x >= vofdiv[i] & x < vofdiv[i+1])]))
}
# [1] 2000
# [1] 2000
# [1] 2000
# [1] 2000
# [1] 2000
# [1] 2000
# [1] 2000
# [1] 2000
# [1] 2000
# [1] 1999 <----

因此,如果您尝试将1999长度向量替换为1999长度1,则会出现错误,因为R中的matrix不能为每列包含不同的维度。

解决方法是将=添加到您的上一个语句,例如

Matrix <- matrix(NA, 2e4, 10)
for(i in 1:10)
  {
    Matrix[, i] <- y[x >= vofdiv[i] & x <= vofdiv[i + 1]] 
  }