我有一个大小为NxK的矩阵A和一个大小为1xK的矢量/矩阵,称为V.
V只包含0和1的元素,例如:
V=matrix(c(0,1,0,0,0,0,1,0,0,1),nrow=1,ncol=10)
矩阵A看起来像这样:
A=matrix(c(1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10),nrow=2,ncol=10)
然后我想在A条件中交换向量V的条件。如果V中的偶数列号(称为r)有1,我想将A中的相应列r与列r-1交换在A。
在上面的示例中,第2列中有1,V中有10,所以我想将第1列与第2列交换,第9列与第10列交换,因此矩阵应如下所示:
A=matrix(c(2,2,1,1,3,3,4,4,5,5,6,6,7,7,8,8,10,10,9,9),nrow=2,ncol=10)
由于
答案 0 :(得分:1)
我可以通过以下方式重现您想要的结果:
V2 <- V * ((1:ncol(V) - 1) %% 2) # only preserve 1s at even spots
A[, 1:ncol(V2) - V2 + cbind(V2[, -1, drop=F], 0)]
导致:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 2 1 3 4 5 6 7 8 10 9
[2,] 2 1 3 4 5 6 7 8 10 9
我们构建一个向量来索引A
中的列,以便根据您的规范对它们进行重新排序。从1:ncol(V)
开始,从中减去V
,将标记的列移回一列,然后将V
移动一列,然后再将其添加到标记列之前移动列之一。