我正在尝试将行添加到特定位置的矩阵中,其中位置包含在向量中。下面的架构显示了输入和预期结果。我试图使用“for”循环,但无法使其工作。任何建议都有帮助。
源矩阵(6x3)
(1) 1 2 3
(2) 4 5 6
(3) 7 8 9
(4) 6 9 2
(5) 3 6 1
(6) 2 2 7
位置向量(表示源矩阵中将包含零的行)
[2, 5, 6]
结果矩阵(6 + length.vector x 3)
(1) 1 2 3
(2*)0 0 0
(3) 4 5 6
(4) 7 8 9
(5*)0 0 0
(6*)0 0 0
(7) 6 9 2
(8) 3 6 1
(9) 2 2 7
答案 0 :(得分:3)
这是一种方法:
## inputs
m <- matrix(c(1,2,3,4,5,6,7,8,9,6,9,2,3,6,1,2,2,7),ncol=3L,byrow=T);
i <- c(2L,5L,6L);
## solution
ris <- integer(nrow(m)+length(i)); ris[i] <- nrow(m)+1L; ris[-i] <- seq_len(nrow(m));
rbind(m,0)[ris,];
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 0 0 0
## [3,] 4 5 6
## [4,] 7 8 9
## [5,] 0 0 0
## [6,] 0 0 0
## [7,] 6 9 2
## [8,] 3 6 1
## [9,] 2 2 7
首先计算行索引ris
的向量。首先将向量分配给所需的大小,即原始矩阵nrow(m)
中的行数加上要插入的行数,即length(i)
。然后将插入索引分配给原始矩阵nrow(m)+1L
中行数之外的索引,并将非插入索引分配给序列seq_len(nrow(m))
。我们可以通过使用ris
索引来获得所需的输出,该复合矩阵由原始矩阵行绑定和一行零(或者希望在每个插入索引处插入任何值集合)组成。
答案 1 :(得分:3)
button1
答案 2 :(得分:1)
这个与@ bgoldst的答案类似,只是有点不同。它添加一行零,然后重新排序行。我们从nrow(m) + 1
长度为nrow(m) + length(x)
的向量开始(其中x
是位置向量),然后将x
中没有的索引替换为各自的原始索引
nr <- nrow(m)
rbind(m, 0)[replace(rep(nr + 1L, nr + length(x)), -x, seq_len(nr)), ]
# [,1] [,2] [,3]
# [1,] 1 2 3
# [2,] 0 0 0
# [3,] 4 5 6
# [4,] 7 8 9
# [5,] 0 0 0
# [6,] 0 0 0
# [7,] 6 9 2
# [8,] 3 6 1
# [9,] 2 2 7
数据:强>
m <- structure(c(1L, 4L, 7L, 6L, 3L, 2L, 2L, 5L, 8L, 9L, 6L, 2L, 3L,
6L, 9L, 2L, 1L, 7L), .Dim = c(6L, 3L))
x <- c(2, 5, 6)
答案 3 :(得分:0)
@SowmyaS.Manian 的回答很好。
让我扩展它以解决稍微不同的情况。该问题标识要创建的结果行。但是,请考虑这样一种情况:目标是在 [2, 5, 6]
之前插入行之前。也就是说,目标是转换:
(1) 1 2 3
(2) 4 5 6
(3) 7 8 9
(4) 6 9 2
(5) 3 6 1
(6) 2 2 7
到
(1) 1 2 3
(2) 0 0 0
(3) 4 5 6
(4) 7 8 9
(5) 6 9 2
(6) 0 0 0
(7) 3 6 1
(8) 0 0 0
(9) 2 2 7
当然,上述解决方案仍然有效,但问题是确定要使用的所需行号。诀窍是添加一个从 0 到行数的向量,以将负 1 插入到行的索引中。考虑:
vec <- c(2, 5, 6)
vec <- vec + 0:length(vec)
new_mat <- matrix(0, nrow=9, ncol=3)
new_mat[-vec,] <- mat
如果您在 Excel 中突出显示第 2、5 和 6 行并单击 insert rows
,这将提供您将获得的结果。