以R中的向量为条件交换列

时间:2014-04-14 20:22:13

标签: r

我有一个大小为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) 

由于

1 个答案:

答案 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移动一列,然后再将其添加到标记列之前移动列之一。