2010-02-21 12 views
5

İki vektörü R'de lockstep'e ayırmanın en etkili yolu nedir? İlk vektör artan sırada sıralanmalı ve ikincisi sıralamadan önce karşılık gelen indislere sahip olan elemanların sıralamadan sonra karşılık gelen indislere sahip olacak şekilde yeniden kilitlenmelidir. Örneğin:İki vektörü R'de lockstep olarak sıralamak için en etkili yol?

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) 

Not: Ben bir yama olarak göndermek için Kendall Tau (N log N) uygulaması bir O oluşturmak için temel olarak kullanmak çalışıyorum olarak Verimliliği burada mutlak bir zorunluluktur olduğunu. Bunu yapmak için C'deki kendi özel işlevimi yazmaktan kaçınmak isterdim, ancak bu, eğer etkin bir şekilde gerçekleştirilemezse istekli olur.

cevap

8

Anladığımdan emin değilim, ama bu order() ne istiyorsun? :

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> 
+0

teşekkür ederiz. Bu ** en etkili yol değil (ekstra bir dolaylılık söz konusu), ama kesinlikle yeterince iyi. – dsimcha

+4

Bu * * en verimli yoldur. R, nesneleri yerinde değiştirmez - ve eğer 'sort.default' için kaynak koduna bakarsanız, 'order()' dahili olarak kullandığını görürsünüz. – hadley

0

ben, o zaman Y (sıralı) X endeksine göre sıralanır kabul cevabı X ilk sıralanır durumlarda doğru olduğundan emin değilim, o X yinelenen değerler varsa, Y her zaman klasik 'düzende x, y' stiliyle sıralanmaz. Örneğin: tüm X dizinlerinin değişti

> x <- c(3,2,2,2,1) 
> y <- c(5,4,3,2,1) 
> xind <- order(x) 
> x[xind] 
[1] 1 2 2 2 3 
> y[xind] 
[1] 1 4 3 2 5 

Y , X yeni düzen tarafından sipariş edilmiş, ancak lockstep içinde edilir. Basit bir fonksiyon gerekli OP ile yapılacak:

> sort.xy <- function(x,y) 
+ { 
+ df.xy <- data.frame(x,y) 
+ df.xy[ order(df.xy[,1], df.xy[,2]), ] 
+ } 

Kullanımda:

> c(sort.xy(x,y)) 
$x 
[1] 1 2 2 2 3 

$y 
[1] 1 2 3 4 5 
İlgili konular