2013-10-17 69 views
6

Có ai biết cách sắp xếp một vector trong R theo giá trị tuyệt đối, vì vậy (-2, 3, 1) -> (1, -2, 3) v.v.Sắp xếp theo giá trị tuyệt đối

Nếu tôi làm điều đó trong python, tôi sẽ tạo một cặp giá trị và ký hiệu của nó, sắp xếp danh sách các cặp theo giá trị tuyệt đối rồi đăng ký lại, nhưng tôi rất mới với R nên không có ý tưởng làm như thế nào.

Cheers

+6

'x [trật tự (abs (x))] '? – Arun

+3

Ngẫu nhiên, trong Python nó sẽ dễ dàng hơn để làm 'x.sort (key = abs)' thay vì tạo ra các cặp –

+0

Cảm ơn rất nhiều! –

Trả lời

8

@ phương pháp Arun là TRT:

v[order(abs(v))] 

nơi v là vector để được sắp xếp.

Ghi chú:

  • Điều này tạo ra một vector mới abs(v) có cùng kích thước như v. Điều này không hiệu quả về bộ nhớ, nhưng tôi không nghĩ rằng điều này có thể tránh được trong R, giống như được thực hiện, ví dụ: Lisp: (sort #'< v :key #'abs) hoặc Python: v.sort(key=abs).
  • phân bổ vector tạm thời này không nhất thiết phải là một điều xấu: bạn làm mất trí nhớ, nhưng bạn giành chiến thắng thời gian bởi vì chìa khóa accessor được gọi là chỉ N lần, không N*log(N) lần, trong đó đặc biệt quan trọng khi quan trọng là không hề rẻ (không giống như abs hoặc một trường cấu trúc).
  • Để chính xác hơn, véc tơ abs(v) là rác được thu thập rất sớm, nhưng phân bổ của nó (và đặc biệt là garbage collection) rất đắt đối với các vectơ lớn và có thể thực sự có vấn đề nếu bộ nhớ bị chặt.

Xem thêm:

+0

Nhưng vector đó là không lâu, phải không? –

+0

@Carl Để phân loại? Điều đó thậm chí có thể? –

+0

@KonradRudolph Tôi có thể đã sử dụng sai cụm từ-- không đúng là vectơ 'abs (v)' không nằm trong môi trường mẹ và sẽ biến mất trong bộ sưu tập rác tiếp theo? Vì vậy, nó có thể ảnh hưởng đến RAM cao điểm nhưng sẽ không được vĩnh viễn. –

1

tôi thấy nó hữu ích để gói này trong một hàm để tôi có thể vượt qua một vector với nó, và cũng để có tùy chọn sử dụng các tùy chọn khác trong hàm order như decreasing. Nó chủ yếu dựa trên the existing answer.

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

Ví dụ,

> 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 
Các vấn đề liên quan