tags:

views:

104

answers:

1

What's the most efficient way to sort two vectors in lockstep in R? The first vector should be sorted in ascending order and the second should be reordered in lockstep such that elements with corresponding indices before the sort still have corresponding indices after the sort. For example:

foo <- c(1,3,2, 5,4)
bar <- c(2,6,4,10,8)
sort2(foo, bar)

# foo == c(1,2,3,4, 5)
# bar == c(2,4,6,8,10)

Note: Efficiency is an absolute must here as I am trying to use this as the basis for creating an O(N log N) implementation of Kendall's Tau to submit as a patch. I'd like to avoid writing my own special function in C to do this, but would be willing to if it can't be done efficiently within R.

+5  A: 

Not sure I understand but is this use of order() what you want:

R> foo <- c(1,3,2, 5,4)
R> bar <- c(2,6,4,10,8)
R> fooind <- order(foo)   # index of ordered 
R> foo[fooind]
[1] 1 2 3 4 5
R> bar[fooind]
[1]  2  4  6  8 10
R> 
Dirk Eddelbuettel
Thanks. This isn't **the** most efficient way (an extra indirection is involved), but it's definitely good enough.
dsimcha
This *is* the most efficient way. R does not modify objects in place - and if you look at the source code for `sort.default` you'll see it uses `order()` internally.
hadley