如何在R中的循环内存储矩阵

时间:2014-02-11 23:47:10

标签: r loops matrix

我有一个我无法弄清楚的简单问题:我想将循环中生成的矩阵存储到一个完整的存储矩阵中。例如,以下代码为每次迭代生成一个矩阵5x5进行三次迭代,但无法将它们存储到一个5x15矩阵中:

species_samp <- sample(unique(iris$Species))
store <- matrix(NA, ncol =5, nrow = 15)

for(i in 1:3){

    samp    <- iris[sample(nrow(iris[iris$Species==species_samp[i],]), 5),]
    store[i,] <- samp
}   

这失败了,但是我想最终有一个存储矩阵,其中包含在循环的每次迭代中采样的完整矩阵。任何和所有帮助表示赞赏。谢谢。

2 个答案:

答案 0 :(得分:2)

正如ALiX指出的那样,您需要在store循环内正确索引for矩阵。在您尝试将每个矩阵分配给单个行时,您将收到如下错误:

Error in store[i,] <- samp : 
  number of items to replace is not a multiple of replacement length

相反,您需要将其分配给正确的行数。您还需要将store设为data.frame而不是矩阵,然后修复列名称和Species列:

species_samp <- sample(unique(iris$Species))
store <- as.data.frame(matrix(NA, ncol =5, nrow = 15))
for(i in 1:3){
    samp    <- iris[sample(nrow(iris[iris$Species==species_samp[i],]), 5),]
    store[(((i-1)*5)+1):(i*5),] <- samp
}
names(store) <- names(samp)
store$Species <- as.factor(store$Species)
levels(store$Species) <- levels(iris$Species)
samp

   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           5.8         4.0          1.2         0.2  setosa
2           5.0         3.0          1.6         0.2  setosa
3           5.1         3.8          1.5         0.3  setosa
4           5.1         3.4          1.5         0.2  setosa
5           4.6         3.4          1.4         0.3  setosa
6           5.1         3.5          1.4         0.2  setosa
7           4.6         3.1          1.5         0.2  setosa
8           5.1         3.5          1.4         0.3  setosa
9           4.9         3.0          1.4         0.2  setosa
10          4.8         3.1          1.6         0.2  setosa
11          5.2         4.1          1.5         0.1  setosa
12          5.1         3.5          1.4         0.2  setosa
13          4.3         3.0          1.1         0.1  setosa
14          5.5         3.5          1.3         0.2  setosa
15          5.1         3.8          1.9         0.4  setosa

答案 1 :(得分:-1)

只需正确索引到分配给的矩阵即可。例如:

store <- matrix(0, nrow=15, ncol=5)
m <- matrix(1:25, nrow=5, ncol=5)
store[1:5, 1:5] <- m
store

      [,1] [,2] [,3] [,4] [,5]
 [1,]    1    6   11   16   21
 [2,]    2    7   12   17   22
 [3,]    3    8   13   18   23
 [4,]    4    9   14   19   24
 [5,]    5   10   15   20   25
 [6,]    0    0    0    0    0
 [7,]    0    0    0    0    0
 [8,]    0    0    0    0    0
 [9,]    0    0    0    0    0
[10,]    0    0    0    0    0
[11,]    0    0    0    0    0
[12,]    0    0    0    0    0
[13,]    0    0    0    0    0
[14,]    0    0    0    0    0
[15,]    0    0    0    0    0