2013-10-17 43 views
6

R içindeki bir vektörün mutlak değerle nasıl sıralanacağını bilen var mı? (-2, 3, 1) -> (1, -2, 3) vb?Mutlak değere göre sırala

Eğer python içinde yapıyor olsaydım, her değer ve onun işareti bir çift oluşturabilirim, çiftlerin listesini mutlak değere göre sıralayın, sonra işareti yeniden uygulayın, ama R için çok yeni olduğum için hiçbir fikrim yok bu nasıl yapılır. v vektör olup

v[order(abs(v))] 

sıralanması için:

alkış arun yöntemi @

+6

'x [sırası (abs (x))] '? – Arun

+3

Tesadüfen, Python'da x123 (key = abs) 'yi yapmak daha kolay olurdu yerine çiftleri oluştur –

+0

Çok teşekkürler! –

cevap

8

TRT olup.

Notlar: Bu v aynı boyutta yeni bir vektör abs(v) yaratır

  • . Bu çok bellek açısından verimli değil, ancak bunun, örneğin, Lisp: (sort #'< v :key #'abs) veya Python: v.sort(key=abs) adresinde yapıldığı gibi R, 'da önlenebileceğini düşünmüyorum.
  • Bu geçici vektör ayırma mutlaka kötü bir şey değildir: belleği kaybedersiniz, ancak zaman kazanırsınız çünkü erişim anahtarı yalnızcakez çağrılır, N*log(N) kez değil, özellikle anahtar ucuz değilse (abs aksine) veya bir yapı alanı).
  • Daha net olmak gerekirse, abs(v) vektörü çok yakında toplanmış çöptür, ancak tahsisi (özellikle garbage collection) büyük vektörler için pahalıdır ve bellek sıkıysa sorunlu olabilir.

Ayrıca bkz:

+0

Ama bu vektör geçici, değil mi? –

+0

@Carl Sıralama için? Bu mümkün mü? –

+0

@KonradRudolph Yanlış terimi kullanmış olabilirim - "abs (v)" vektörünün üst ortamda olmadığı ve bir sonraki çöp toplamada yok olacağı doğru değil mi? Bu yüzden en yüksek RAM'i etkileyebilir, ancak kalıcı olmayacaktır. –

1

I buna bir vektör geçebileceği şekilde yararlı bir fonksiyonu olarak, bu paket bulundu ve ayrıca order işlevi gibi diğer seçenekleri kullanma seçeneği de vardı. Temelde the existing answer dayanmaktadır. Örneğin

sort_abs <- function(x, na.last = TRUE, decreasing = FALSE) { 
    x[order(abs(x), na.last = na.last, decreasing = decreasing)] 
} 

,

> sort_abs(c(-1,NA,2,-2)) 
[1] -1 2 -2 NA 
> sort_abs(c(-1,NA,2,-2), decreasing = TRUE, na.last = FALSE) 
[1] NA 2 -2 -1