我有一个关于将模拟数据放入矩阵格式的问题,但是我不能在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
我非常感谢有人帮助我!
答案 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]]
}