2010-02-21 38 views
5

Cách hiệu quả nhất để sắp xếp hai vectơ ở bước khóa trong R là gì? Vectơ đầu tiên nên được sắp xếp theo thứ tự tăng dần và thứ hai nên được sắp xếp lại theo thứ tự khóa để các phần tử có chỉ số tương ứng trước khi sắp xếp vẫn có các chỉ số tương ứng sau khi sắp xếp. Ví dụ:Cách hiệu quả nhất để sắp xếp hai vectơ ở bước khóa trong R?

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) 

Lưu ý: Hiệu quả là phải tuyệt đối ở đây như tôi đang cố gắng để sử dụng như là cơ sở cho việc tạo ra một O (N log N) thi hành Tàu Kendall để nộp như một bản vá. Tôi muốn tránh viết chức năng đặc biệt của riêng tôi trong C để thực hiện việc này, nhưng sẽ sẵn lòng nếu không thể thực hiện hiệu quả trong phạm vi R.

Trả lời

8

Không chắc chắn tôi hiểu nhưng đây là việc sử dụng order() những gì bạn muốn :

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

Cảm ơn. Đây không phải là ** cách hiệu quả nhất (một sự gián đoạn thêm có liên quan), nhưng nó chắc chắn là đủ tốt. – dsimcha

+4

Đây là * cách hiệu quả nhất. R không sửa đổi các đối tượng tại chỗ - và nếu bạn nhìn vào mã nguồn cho 'sort.default' bạn sẽ thấy nó sử dụng' order() 'nội bộ. – hadley

0

Tôi không chắc rằng câu trả lời được chấp nhận là chính xác trong trường hợp X được sắp xếp trước, sau đó Y được sắp xếp theo chỉ mục (sắp xếp) X, nếu có giá trị trùng lặp trong X, Y không phải lúc nào cũng được sắp xếp theo thứ tự cổ điển 'theo x, y'. Ví dụ:

> 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 được lệnh của trật tự mới của X, nhưng không phải theo sát bước chân, như không phải tất cả các chỉ số X thay đổi. Một chức năng đơn giản để làm như OP yêu cầu:

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

Trong sử dụng:

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

$y 
[1] 1 2 3 4 5 
Các vấn đề liên quan