在R中同时排序两个向量的最有效方法是什么?

5
什么是在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)

注意:在这里效率绝对是必须的,因为我正试图将其用作创建Kendall's Tau的O(N log N)实现的基础来提交补丁。我希望避免编写自己的特殊C函数来完成此任务,但如果无法在R中高效地完成,则愿意这样做。
2个回答

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> 

谢谢。这不是高效的方法(涉及额外的间接性),但绝对足够好。 - dsimcha
4
这是最有效的方式。 R不会在原地修改对象 - 如果你查看sort.default的源代码,你会发现它在内部使用了order()函数。 - hadley

0

如果X先排序,然后按(已排序的)X的索引对Y进行排序,在这种情况下,我不确定接受的答案是否正确,因为如果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

Y 按照 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接