below is another way ( maybe the same ? )but with an extra line to make roworder. i'm also not clear on why I have to take the transpose of the result that comes back form the apply call. in ?apply, it says that the function tries to convert the result back to a matrix. that's fine but why does it do it in the opposite way from the way the data in sent in ( i.e : by row ). if someone could explain that, i'd appreciate it.

a1 <- structure(c(7, 4, 4, 0, 6, 2, 7, 3, 8, 4, 2, 8), .Dim = c(4L, 3L))
a2 <- structure(c(101L, 101L, 101L, 101L, 102L, 102L, 102L, 102L, 103L,
103L, 103L, 103L), .Dim = c(4L, 3L))

roworder <- t(apply(a1,1,order))

a3 <- t(sapply(1:nrow(a2),function(.rowind) {
  a2[.rowind,roworder[.rowind,]]
}))

print(a3)



On Thu, Jul 31, 2008 at  6:05 PM, Johnson, Eric A. (Seattle) wrote:

If you're not adverse to cbind-ing a1 and a2, you can use this:

a1a2 <- cbind(a1, a2)

a3 <- t(apply(a1a2, 1, function(x) x[order(x[1:ncol(a1)])+ncol(a1)]))

Eric


-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
On Behalf Of Timothy W. Hilton
Sent: Thursday, July 31, 2008 2:19 PM
To: r-help@r-project.org
Subject: [R] sort rows of matrix by rows of another matrix

Hello all,

I am trying to sort rows of one matrix by rows of another. Given a1 and
a2:

------
a1
     [,1] [,2] [,3]
[1,]    7    6    8
[2,]    4    2    4
[3,]    4    7    2
[4,]    0    3    8

a1 <-
structure(c(7, 4, 4, 0, 6, 2, 7, 3, 8, 4, 2, 8), .Dim = c(4L, 3L))

a2
     [,1] [,2] [,3]
[1,]  101  102  103
[2,]  101  102  103
[3,]  101  102  103
[4,]  101  102  103

a2 <-
structure(c(101L, 101L, 101L, 101L, 102L, 102L, 102L, 102L, 103L, 103L, 103L, 103L), .Dim = c(4L, 3L))
------

I want to get a3:

a3
     [,1] [,2] [,3]
[1,]  102  101  103
[2,]  102  101  103
[3,]  103  101  102
[4,]  101  102  103

where the rows of a3 are the rows of a2 sorted according to the rows of
a1.

I can get the necessary sorting index:
apply(a1, 1, order)
     [,1] [,2] [,3] [,4]
[1,]    2    2    3    1
[2,]    1    1    1    2
[3,]    3    3    2    3

and I can get the rows of a1 sorted according to the rows of a1:
t(apply(a1, 1, function(x) x[order(x)]))
     [,1] [,2] [,3]
[1,]    6    7    8
[2,]    2    4    4
[3,]    2    4    7
[4,]    0    3    8

but I can't get the rows of a2 sorted according to the rows of a1...

Thanks,
Tim

______________________________________________
R-help@r-project.org mailing list
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@r-project.org mailing list
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@r-project.org mailing list
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.

Reply via email to