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

Fer*_*lis 5 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
Run Code Online (Sandbox Code Playgroud)

位置向量(指示源矩阵中将包含零的行)

[2, 5, 6]  
Run Code Online (Sandbox Code Playgroud)

结果矩阵(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
Run Code Online (Sandbox Code Playgroud)

Sow*_*ian 7

mat <- matrix(1:18,6)
vec <- c(2, 5, 6)

# New matrix 'new_mat' with all zeros, 
# No. of rows = original matrix rows + number new rows to be added
new_mat <- matrix(0,nrow=9,ncol=3)  

# 'new_mat' rows getting filled with `mat` values
new_mat[-vec,] <- mat   
new_mat
#      [,1] [,2] [,3]
# [1,]    1    7   13
# [2,]    0    0    0
# [3,]    2    8   14
# [4,]    3    9   15
# [5,]    0    0    0
# [6,]    0    0    0
# [7,]    4   10   16
# [8,]    5   11   17
# [9,]    6   12   18
Run Code Online (Sandbox Code Playgroud)


bgo*_*dst 4

这是一种方法:

## 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
Run Code Online (Sandbox Code Playgroud)

它的工作原理是首先计算行索引向量ris。首先将向量分配到所需的大小,即原始矩阵的行数nrow(m)加上要插入的行数,即length(i)。然后将插入索引分配给刚好超出原始矩阵行数的索引nrow(m)+1L,将非插入索引分配给序列seq_len(nrow(m))。我们可以通过使用ris复合矩阵进行索引来获得所需的输出,该复合矩阵由原始矩阵与一行零(或希望在每个插入索引处插入的任何值集)进行行绑定组成。