2014-04-14 26 views
1

我有N×K个大小的矩阵称为A和大小1xK的向量/矩阵称为V.交换列矢量condional中的R

V仅用于由零和个元件,一个示例可以是这样的:

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) 

那么我想交换的矢量V在条件列如果有一个1时,在偶数列数(称为r)在V中,我想将A中的相应列r与列中的r-1交换。

在上面的示例中,第2列中有1,V中有第10列,所以我想将列1交换为列2,并且列10列9,所以矩阵应该是这样的:

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可重现的示例和预期的答案。 – BrodieG

回答

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移动一列,并将其添加回来以将标记列之前的列移动一个。

+0

你好布罗迪,谢谢你的回答!不幸的是,我认为它也交换了第6列和第7列,但是这些不应该交换,因为1出现在V中的奇数列数,即第7列。 –

+0

@ Ku-trala,argh,错过了那个。查看更新。 – BrodieG

+0

太棒了。按预期工作。谢谢。 –