如何用循环填充矩阵并为colum填充相同的值

时间:2016-03-08 14:48:02

标签: r for-loop matrix

我有这个矩阵:

mat_A <- matrix(ncol=7,nrow=12)

我会在mat_A列中为每列填充相同的值,其值范围为5到11.预期结果为:

        [,1] [,2] [,3] [,4] [,5] [,6] [,7]
 [1,]    5    6    7    8    9   10   11
 [2,]    5    6    7    8    9   10   11
 [3,]    5    6    7    8    9   10   11
 [4,]    5    6    7    8    9   10   11
 [5,]    5    6    7    8    9   10   11
 [6,]    5    6    7    8    9   10   11
 [7,]    5    6    7    8    9   10   11
 [8,]    5    6    7    8    9   10   11
 [9,]    5    6    7    8    9   10   11
[10,]    5    6    7    8    9   10   11
[11,]    5    6    7    8    9   10   11
[12,]    5    6    7    8    9   10   11

我知道我可以按列托盘,例如:

mat_A[,1] <- 5
....
mat_A[,7] <- 11

但为什么我可以用循环for?做到这一点 我尝试过:

pippo <- rep(5:11,each=12)
  for(j in 1:ncol(mat_A)){
    mat_A[j,] <- pippo
  }

但错误是:

Error in mat_A[j, ] <- pippo : 
  number of items to replace is not a multiple of replacement length

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

你不需要循环。试试

mat_A <- matrix(ncol=7,nrow=12)
mat_A <- col(mat_A)+4
mat_A
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7]
# [1,]    5    6    7    8    9   10   11
# [2,]    5    6    7    8    9   10   11
# [3,]    5    6    7    8    9   10   11
# [4,]    5    6    7    8    9   10   11
# [5,]    5    6    7    8    9   10   11
# [6,]    5    6    7    8    9   10   11
# [7,]    5    6    7    8    9   10   11
# [8,]    5    6    7    8    9   10   11
# [9,]    5    6    7    8    9   10   11
#[10,]    5    6    7    8    9   10   11
#[11,]    5    6    7    8    9   10   11
#[12,]    5    6    7    8    9   10   11

或者,如果你想使用OP中描述的循环,可以在两次修改后使用代码:

  1. 删除each=12
  2. 遍历行,而不是列。
  3. 因此,这也有效:

    pippo <- rep(5:11)
    for(j in 1:nrow(mat_A)){
        mat_A[j,] <- pippo
    }
    

答案 1 :(得分:1)

您可以简单地构建矩阵:

mat_A <- matrix(rep(5:11, each=12), 12)

这里有三个答案的微基准测试结果:

> library(microbenchmark)
> microbenchmark(
+   by.row= matrix(5:11,ncol=7,nrow=12,byrow=TRUE), 
+   rep=matrix(rep(5:11, each=12), 12),
+   col.plus=col(matrix(ncol=7,nrow=12))+4,
+   loop={mat_A <- matrix(ncol=7,nrow=12); pippo <- rep(5:11);    for(j in 1:nrow(mat_A))     mat_A[j,] <- pippo }
+ )
Unit: microseconds
     expr    min      lq     mean  median      uq    max neval cld
   by.row  2.681  2.9505  3.27668  3.0955  3.3025 14.087   100 a  
      rep  3.780  4.0580  4.26584  4.2170  4.3485  5.707   100 ab 
 col.plus  4.230  4.5000  4.81078  4.6905  4.8680 10.853   100  b 
     loop 17.946 18.4055 19.87737 18.6970 19.1745 65.719   100   c

答案 2 :(得分:1)

matrix函数有一个byrow参数,可用于此目的的R&#39>回收行为

matrix(5:11,ncol=7,nrow=12,byrow=TRUE)