【问题标题】:Most efficient way to sort two vectors in lockstep in R?在R中以同步方式对两个向量进行排序的最有效方法?
【发布时间】:2011-01-19 11:00:25
【问题描述】:

在 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 中有效地完成,我愿意这样做。

【问题讨论】:

    标签: sorting r


    【解决方案1】:

    不确定我是否理解,但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> 
    

    【讨论】:

    • 谢谢。这不是最有效的方法(涉及额外的间接),但它绝对足够好。
    • 最有效的方式。 R 不会就地修改对象 - 如果您查看 sort.default 的源代码,您会发现它在内部使用了 order()
    【解决方案2】:

    我不确定在首先对 X 排序的情况下接受的答案是否正确,然后 Y 按(排序的)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
    

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-07
      • 2018-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      • 2021-06-07
      相关资源
      最近更新 更多