Re: [R] Vectorize rearrangement within each column

From: <Bill.Venables_at_csiro.au>
Date: Fri 19 Jan 2007 - 08:00:05 GMT

As with most things like this, you can trade memory for speed. Here is an obfuscated solution that appears to eschew loops entirely.

> ma <- matrix(10:15, nr = 3)
> idx <- matrix(c(1,3,2, 2,3,1), nr = 3)
> mb <- ma
> mb[] <- as.vector(ma)[as.vector(idx + 
	outer(rep(nrow(ma), nrow(ma)), 1:ncol(ma)-1, '*'))]
> mb
     [,1] [,2]

[1,] 10 14
[2,] 12 15
[3,] 11 13

Ordinarily, though, my preferred solution would be the for() loop.

Bill Venables
CMIS, CSIRO Laboratories,
PO Box 120, Cleveland, Qld. 4163
AUSTRALIA
Office Phone (email preferred): +61 7 3826 7251 Fax (if absolutely necessary): +61 7 3826 7304

Mobile (rarely used):                +61 4 1963 4642
Home Phone:                          +61 7 3286 7700
mailto:Bill.Venables@csiro.au
http://www.cmis.csiro.au/bill.venables/    

-----Original Message-----
From: r-help-bounces@stat.math.ethz.ch
[mailto:r-help-bounces@stat.math.ethz.ch] On Behalf Of Osorio Roberto
Sent: Friday, 19 January 2007 4:15 PM
To: r-help@stat.math.ethz.ch
Subject: [R] Vectorize rearrangement within each column

Consider a matrix like

 > ma = matrix(10:15, nr = 3)
 > ma

      [,1] [,2]
[1,] 10 13
[2,] 11 14
[3,] 12 15

I want to rearrange each column according to row indexes (1 to 3) given in another matrix, as in

 > idx = matrix(c(1,3,2, 2,3,1), nr = 3)  > idx

      [,1] [,2]
[1,] 1 2
[2,] 3 3
[3,] 2 1

The new matrix mb will have for each column the corresponding column of ma indexed by the corresponding column of idx, as in

 > mb = ma
 > for (j in 1:2) mb[,j] = ma[idx[,j], j]	
 > mb
      [,1] [,2]

[1,] 10 14
[2,] 12 15
[3,] 11 13

Can I avoid the for() loop? I'm specially interested to find out if a fast implementation using lapply() would be feasible for large input matrices (analogues of ma and idx) transformed into data frames.

Roberto Osorio



R-help@stat.math.ethz.ch 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@stat.math.ethz.ch 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. Received on Fri Jan 19 19:05:57 2007

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.1.8, at Fri 19 Jan 2007 - 08:30:27 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.