2014-04-14 58 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

太棒了。按預期工作。謝謝。 –