我有这个矩阵:
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
有什么想法吗?
答案 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中描述的循环,可以在两次修改后使用代码:
each=12
和因此,这也有效:
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)