[R] re-ordering a vector by name

Sundar Dorai-Raj sundar.dorai-raj at PDF.COM
Fri May 7 23:55:58 CEST 2004



Liaw, Andy wrote:

> Dear R-help,
> 
> Let's say `x1' and `x2' are very long vectors (length=5e5, say) with same
> set of names but in different order.  If I want to sort `x2' in the order of
> `x1', I would do 
> 
>   x2[names(x1)]
> 
> but the amount of time that takes is quite prohibitive!  Does anyone have
> any suggestion on a more efficient way to do this?
> 
> If the two vectors are exactly the same length (as I said above), sorting
> both by names would probably be the fastest.  However, if the two vectors
> differ in length (and the names for the shorter one are a subset of names of
> the longer one) then that doesn't work...
> 
> Best,
> Andy
> 
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://www.stat.math.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html

Hi Andy,
   Using match seems to be *much* faster:

R> x1 <- 1:10000; names(x1) <- 1:10000
R> x2 <- 1:10000; names(x2) <- 10000:1
R> system.time(x3 <- x1[names(x2)])
[1] 1.88 0.00 1.88   NA   NA
R> system.time(x4 <- x1[match(names(x1), names(x2))])
[1] 0.01 0.00 0.01   NA   NA
R> all.equal(x3, x4)
[1] TRUE
R>

This should also work if x1 and x2 are of diffent lengths.

--sundar




More information about the R-help mailing list