Hi there,
I have two matrices, A and B. The columns of B is the index of the
corresponding columns of A. I hope to rearrange of A by B. A minimal
example is following:
> set.seed(123)
> A <- matrix(sample(1:10), nrow = 5)
> B <- matrix(c(sample(1:5), sample(1:5)), nrow =5, byrow = FALSE)
> A
[,1] [,2]
[1,] 3 9
[2,] 10 1
[3,] 2 7
[4,] 8 5
[5,] 6 4
> B
[,1] [,2]
[1,] 2 1
[2,] 3 4
[3,] 1 5
[4,] 4 3
[5,] 5 2
> A[,1] <- A[,1][B[,1]]
> A[,2] <- A[,2][B[,2]]
> A
[,1] [,2]
[1,] 10 9
[2,] 2 5
[3,] 3 4
[4,] 8 7
[5,] 6 1
My question is whether there is any elegant or generalized way to replace:
> A[,1] <- A[,1][B[,1]]
> A[,2] <- A[,2][B[,2]]
Thanks in advance.
PS., I know how to do the above thing by loop.
Best,
Jinsong
Here is one way
A <- sapply(1:ncol(A), function(i) {A[,i][B[,i]]})
On Fri, Oct 11, 2019 at 12:44 PM Jinsong Zhao <jszhao at yeah.net> wrote:
> Hi there,
>
> I have two matrices, A and B. The columns of B is the index of the
> corresponding columns of A. I hope to rearrange of A by B. A minimal
> example is following:
>
> > set.seed(123)
> > A <- matrix(sample(1:10), nrow = 5)
> > B <- matrix(c(sample(1:5), sample(1:5)), nrow =5, byrow = FALSE)
> > A
> [,1] [,2]
> [1,] 3 9
> [2,] 10 1
> [3,] 2 7
> [4,] 8 5
> [5,] 6 4
> > B
> [,1] [,2]
> [1,] 2 1
> [2,] 3 4
> [3,] 1 5
> [4,] 4 3
> [5,] 5 2
> > A[,1] <- A[,1][B[,1]]
> > A[,2] <- A[,2][B[,2]]
> > A
> [,1] [,2]
> [1,] 10 9
> [2,] 2 5
> [3,] 3 4
> [4,] 8 7
> [5,] 6 1
>
> My question is whether there is any elegant or generalized way to replace:
>
> > A[,1] <- A[,1][B[,1]]
> > A[,2] <- A[,2][B[,2]]
>
> Thanks in advance.
>
> PS., I know how to do the above thing by loop.
>
> Best,
> Jinsong
>
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>
[[alternative HTML version deleted]]
Martin Morgan
2019-Oct-11 12:26 UTC
[R] how to use a matrix as an index to another matrix?
A matrix can be subset by another 2-column matrix, where the first column is the
row index and the second column the column index. So
idx = matrix(c(B, col(B)), ncol = 2)
A[] <- A[idx]
Martin Morgan
?On 10/11/19, 6:31 AM, "R-help on behalf of Eric Berger"
<r-help-bounces at r-project.org on behalf of ericjberger at gmail.com>
wrote:
Here is one way
A <- sapply(1:ncol(A), function(i) {A[,i][B[,i]]})
On Fri, Oct 11, 2019 at 12:44 PM Jinsong Zhao <jszhao at yeah.net>
wrote:
> Hi there,
>
> I have two matrices, A and B. The columns of B is the index of the
> corresponding columns of A. I hope to rearrange of A by B. A minimal
> example is following:
>
> > set.seed(123)
> > A <- matrix(sample(1:10), nrow = 5)
> > B <- matrix(c(sample(1:5), sample(1:5)), nrow =5, byrow =
FALSE)
> > A
> [,1] [,2]
> [1,] 3 9
> [2,] 10 1
> [3,] 2 7
> [4,] 8 5
> [5,] 6 4
> > B
> [,1] [,2]
> [1,] 2 1
> [2,] 3 4
> [3,] 1 5
> [4,] 4 3
> [5,] 5 2
> > A[,1] <- A[,1][B[,1]]
> > A[,2] <- A[,2][B[,2]]
> > A
> [,1] [,2]
> [1,] 10 9
> [2,] 2 5
> [3,] 3 4
> [4,] 8 7
> [5,] 6 1
>
> My question is whether there is any elegant or generalized way to
replace:
>
> > A[,1] <- A[,1][B[,1]]
> > A[,2] <- A[,2][B[,2]]
>
> Thanks in advance.
>
> PS., I know how to do the above thing by loop.
>
> Best,
> Jinsong
>
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>
[[alternative HTML version deleted]]
______________________________________________
R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
Hi Jinsong, In such a case I think explicit loop IS the most elegant solution. for(i in 1:2) A[,i] <- A[,i][B[,i]] Linus On Fri, 11 Oct 2019 at 11:44, Jinsong Zhao <jszhao at yeah.net> wrote:> > Hi there, > > I have two matrices, A and B. The columns of B is the index of the > corresponding columns of A. I hope to rearrange of A by B. A minimal > example is following: > > > set.seed(123) > > A <- matrix(sample(1:10), nrow = 5) > > B <- matrix(c(sample(1:5), sample(1:5)), nrow =5, byrow = FALSE) > > A > [,1] [,2] > [1,] 3 9 > [2,] 10 1 > [3,] 2 7 > [4,] 8 5 > [5,] 6 4 > > B > [,1] [,2] > [1,] 2 1 > [2,] 3 4 > [3,] 1 5 > [4,] 4 3 > [5,] 5 2 > > A[,1] <- A[,1][B[,1]] > > A[,2] <- A[,2][B[,2]] > > A > [,1] [,2] > [1,] 10 9 > [2,] 2 5 > [3,] 3 4 > [4,] 8 7 > [5,] 6 1 > > My question is whether there is any elegant or generalized way to replace: > > > A[,1] <- A[,1][B[,1]] > > A[,2] <- A[,2][B[,2]] > > Thanks in advance. > > PS., I know how to do the above thing by loop. > > Best, > Jinsong > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.
No loops necessary. Use array indexing (see ?"[", of course -- the section on matrices and arrays) set.seed(123) A <- matrix(sample(1:10), nrow = 5) B <- matrix(c(sample(1:5), sample(1:5)), nrow =5, byrow = FALSE) ## The following could be a 1-liner, but I broke it out for clarity. ix <- cbind(as.vector(B), rep(1:2, e=5)) ix matrix(A[ix], ncol =2) Cheers, Bert Bert Gunter "The trouble with having an open mind is that people keep coming along and sticking things into it." -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) On Mon, Oct 28, 2019 at 1:48 PM Linus Chen <linus.l.chen at gmail.com> wrote:> Hi Jinsong, > > In such a case I think explicit loop IS the most elegant solution. > for(i in 1:2) A[,i] <- A[,i][B[,i]] > > Linus > > On Fri, 11 Oct 2019 at 11:44, Jinsong Zhao <jszhao at yeah.net> wrote: > > > > Hi there, > > > > I have two matrices, A and B. The columns of B is the index of the > > corresponding columns of A. I hope to rearrange of A by B. A minimal > > example is following: > > > > > set.seed(123) > > > A <- matrix(sample(1:10), nrow = 5) > > > B <- matrix(c(sample(1:5), sample(1:5)), nrow =5, byrow = FALSE) > > > A > > [,1] [,2] > > [1,] 3 9 > > [2,] 10 1 > > [3,] 2 7 > > [4,] 8 5 > > [5,] 6 4 > > > B > > [,1] [,2] > > [1,] 2 1 > > [2,] 3 4 > > [3,] 1 5 > > [4,] 4 3 > > [5,] 5 2 > > > A[,1] <- A[,1][B[,1]] > > > A[,2] <- A[,2][B[,2]] > > > A > > [,1] [,2] > > [1,] 10 9 > > [2,] 2 5 > > [3,] 3 4 > > [4,] 8 7 > > [5,] 6 1 > > > > My question is whether there is any elegant or generalized way to > replace: > > > > > A[,1] <- A[,1][B[,1]] > > > A[,2] <- A[,2][B[,2]] > > > > Thanks in advance. > > > > PS., I know how to do the above thing by loop. > > > > Best, > > Jinsong > > > > ______________________________________________ > > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > > https://stat.ethz.ch/mailman/listinfo/r-help > > PLEASE do read the posting guide > http://www.R-project.org/posting-guide.html > > and provide commented, minimal, self-contained, reproducible code. > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide > http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >[[alternative HTML version deleted]]