使用R在矩阵中的特定位置插入行

时间:2016-06-04 01:24:22

标签: r matrix

我正在尝试将行添加到特定位置的矩阵中,其中位置包含在向量中。下面的架构显示了输入和预期结果。我试图使用“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

4 个答案:

答案 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,这将提供您将获得的结果。