【问题标题】:Insert row at a specific location in matrix using R使用R在矩阵中的特定位置插入行
【发布时间】:2022-05-15 22:59:26
【问题描述】:

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

【问题讨论】:

    标签: r matrix


    【解决方案1】:
    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
    

    【讨论】:

    • @Richard Scriven。嗨,是的,这是一个很大的改进。非常感谢,我学到了很多东西。 :)
    【解决方案2】:

    这是一种方法:

    ## 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 索引复合矩阵来获得所需的输出,该复合矩阵由行绑定的原始矩阵和一行零(或希望在每个插入索引处插入的任何值集)组成。

    【讨论】:

      【解决方案3】:

      这与@bgoldst 的答案相似,只是有点不同。它添加一行零,然后对行重新排序。我们从长度为nrow(m) + length(x)nrow(m) + 1 向量开始(其中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)
      

      【讨论】:

      • 经过进一步审查,这与另一个答案非常接近。如果有人觉得我应该删除它,请点赞此评论。第二意见总是很重要。
      【解决方案4】:

      @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,这将为您提供。

      【讨论】:

        【解决方案5】:

        这一定为时已晚,但我希望这个回复对任何人都有帮助。设源矩阵为对象 A。

        AA <- A[c(1,1,2,3,3,3,4,5,6), ]
        AA[c(2,5,6), ] <- c(0,0,0)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-16
          • 2016-04-09
          相关资源
          最近更新 更多