2010-02-21 34 views
5

在R中對鎖步中的兩個向量進行排序的最有效方法是什麼?第一個向量應該按升序排序,第二個向量應該以鎖步方式重新排序,這樣排序之前排序前具有相應索引的元素仍然具有相應的索引。例如:最有效的方法來排序兩個向量在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) 

注:效率是絕對必要這裏我想用這個爲基礎,創建一個O(N日誌N)的實施Kendall的tau的提交的補丁。我想避免在C編寫我自己的特殊功能來做到這一點,但願意,如果它不能在R內有效完成。

回答

8

不知道我明白,但是這是使用order()你想要什麼:

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

謝謝。這不是**最有效的方式(涉及額外的間接性),但它絕對足夠好。 – dsimcha 2010-02-21 23:47:24

+4

這是*最有效的方法。 R不會修改對象 - 如果您查看'sort.default'的源代碼,您會發現它在內部使用'order()'。 – hadley 2010-02-22 15:43:34

0

我不知道這一點,那麼Y由(排序)X的指數排序的接受的答案是在X是第一排序情況下是正確的,因爲如果在X重複值, Y並不總是按照傳統的'按x,y'順序排序。例如:

> 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 

Ÿ通過X的新的順序排列,而不是步調一致,因爲不是所有的X指標的變化。一個簡單的函數來完成所需的OP:

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

在使用中:

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

$y 
[1] 1 2 3 4 5 
相關問題