在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的Tau的O(N log N)实现的基础,以作为补丁提交。我想避免在C中编写我自己的特殊功能来执行此操作,但如果在R中无法有效完成,我愿意这样做。
答案 0 :(得分: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>
答案 1 :(得分:0)
我不确定在首先排序X的情况下接受的答案是否正确,然后Y按照(排序)X的索引排序,如果X中有重复值,则Y不总是按照经典&#39;顺序排序x,y&#39;样式。例如:
> 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