【问题标题】:Insert column vector at specific position in matrix dynamically在矩阵中的特定位置动态插入列向量
【发布时间】:2017-11-18 18:14:47
【问题描述】:

我必须将一个新向量(在本例中为零向量)放入现有矩阵。问题是我有一个迭代过程,并且要插入的向量的位置和数量发生了变化。我还没有想出一个函数,a) 有效,b) 对于大量数据来说足够高效。

仅使用cbind() 的非动态方法是

old <- matrix(1,10,10) #original matrix
vec <- matrix(5,10,1) #vector 1 to insert
vec2 <- matrix(8,10,1) #vector 2 to insert
old

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    1    1    1    1    1    1    1    1    1     1
 [2,]    1    1    1    1    1    1    1    1    1     1
 [3,]    1    1    1    1    1    1    1    1    1     1
 [4,]    1    1    1    1    1    1    1    1    1     1
 [5,]    1    1    1    1    1    1    1    1    1     1
 [6,]    1    1    1    1    1    1    1    1    1     1
 [7,]    1    1    1    1    1    1    1    1    1     1
 [8,]    1    1    1    1    1    1    1    1    1     1
 [9,]    1    1    1    1    1    1    1    1    1     1
[10,]    1    1    1    1    1    1    1    1    1     1

#assume that the positions to insert are 4 and 8

goal <- cbind(old[,c(1:3)], 
              vec, 
              old[,4:6], #attention, now old column 6 is new column 7
              vec2, 
              old[,7:ncol(old)])

goal

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
 [1,]    1    1    1    5    1    1    1    8    1     1     1     1
 [2,]    1    1    1    5    1    1    1    8    1     1     1     1
 [3,]    1    1    1    5    1    1    1    8    1     1     1     1
 [4,]    1    1    1    5    1    1    1    8    1     1     1     1
 [5,]    1    1    1    5    1    1    1    8    1     1     1     1
 [6,]    1    1    1    5    1    1    1    8    1     1     1     1
 [7,]    1    1    1    5    1    1    1    8    1     1     1     1
 [8,]    1    1    1    5    1    1    1    8    1     1     1     1
 [9,]    1    1    1    5    1    1    1    8    1     1     1     1
[10,]    1    1    1    5    1    1    1    8    1     1     1     1

但是,我想不出可以同时改变位置和要插入的向量数量的方法。 非常感谢任何帮助,非常感谢。

【问题讨论】:

    标签: r matrix vector


    【解决方案1】:

    将向量绑定到old,然后重新排序。如果我们知道no 已经排序,那么我们可以将sort(no) 替换为no

    no <- c(4, 8)
    vecs <- cbind(vec, vec2)
    cbind(old, vecs)[, order(c(1:ncol(old), sort(no) - seq_along(no))) ]
    

    【讨论】:

    • 不幸的是,这不起作用,因为 vec 进入位置 5 而 vec2 进入位置 10。
    • 已修改以保留问题中的含义。
    【解决方案2】:

    扩展 G. Grothendiecks 方法并解决排序问题:

    pos<-c(4,8)
    pos<-pos-c(1:length(pos))
    cbind(old, vec, vec2)[, order(c(1:ncol(old), c(pos)))]
    

    编辑:对不起,没有看到上面答案的编辑:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      • 1970-01-01
      相关资源
      最近更新 更多