在列中的特定位置动态插入列向量

时间:2017-11-18 18:14:47

标签: r matrix vector

我必须将一个新的向量(在这个例子中为零向量)放入一个现有的矩阵中。问题是我有一个迭代过程,插入的向量的位置和数量发生了变化。我无法提出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

但是,我想不出能够同时改变位置和插入的矢量数量的东西。 非常感谢任何帮助,非常感谢。

2 个答案:

答案 0 :(得分:2)

将矢量cbind到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))) ]

答案 1 :(得分:0)

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

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

编辑:抱歉,没有看到上面答案的编辑:)