【问题标题】:Understanding the order() function理解 order() 函数
【发布时间】:2011-01-19 21:52:53
【问题描述】:

我试图了解order() 函数的工作原理。我的印象是它返回了一个索引排列,排序时会对原始向量进行排序。

例如,

> a <- c(45,50,10,96)
> order(a)
[1] 3 1 2 4

我预计这会返回 c(2, 3, 1, 4),因为排序后的列表将是 10 45 50 96。

谁能帮我理解这个函数的返回值?

【问题讨论】:

    标签: r sorting r-faq


    【解决方案1】:

    它们相似但不一样

    set.seed(0)
    x<-matrix(rnorm(10),1)
    
    # one can compute from the other
    rank(x)  == col(x)%*%diag(length(x))[order(x),]
    order(x) == col(x)%*%diag(length(x))[rank(x),]
    # rank can be used to sort
    sort(x) == x%*%diag(length(x))[rank(x),]
    

    【讨论】:

    • rank 是顺序的逆排列:all(x==x[order(x)][rank(x)]) 始终为真。一些排列是它们自己的逆,但大多数不是。无序排列的逆排序()是rank()。这就解释了为什么它们有时相同而有时不同。
    【解决方案2】:

    简单来说,order() 给出了数量级增加的元素的位置。

    例如,order(c(10,20,30)) 将给出 1,2,3order(c(30,20,10)) 将给出 3,2,1

    【讨论】:

      【解决方案3】:

      这在某些时候可能会对您有所帮助。

      a <- c(45,50,10,96)
      a[order(a)]
      

      你得到的是

      [1] 10 45 50 96
      

      我编写的代码表明您希望“a”作为“a”的整个子集,并且您希望它从最低值到最高值排序。

      【讨论】:

        【解决方案4】:

        运行这段小代码让我理解了order函数

        x <- c(3, 22, 5, 1, 77)
        
        cbind(
          index=1:length(x),
          rank=rank(x),
          x, 
          order=order(x), 
          sort=sort(x)
        )
        
             index rank  x order sort
        [1,]     1    2  3     4    1
        [2,]     2    4 22     1    3
        [3,]     3    3  5     3    5
        [4,]     4    1  1     2   22
        [5,]     5    5 77     5   77
        

        参考:http://r.789695.n4.nabble.com/I-don-t-understand-the-order-function-td4664384.html

        【讨论】:

        • 结果与输入不匹配。您必须在 cbind() 中使用了不同的 x
        • 针对上述 cmets 进行了修改。希望这会有所帮助:)
        【解决方案5】:

        This 好像解释过了。

        order的定义是a[order(a)]在 递增顺序。这适用于您的示例,其中正确的 order 是第四个,第二个,第一个,然后是第三个元素。

        您可能一直在寻找 rank,它会返回 元素
        R&gt; a &lt;- c(4.1, 3.2, 6.1, 3.1)
        R&gt; order(a)
        [1] 4 2 1 3
        R&gt; rank(a)
        [1] 3 2 4 1
        所以rank 告诉你数字的顺序, order 告诉你如何按升序获取它们。

        plot(a, rank(a)/length(a)) 将给出 CDF 的图表。看看为什么 order 很有用,不过,试试plot(a, rank(a)/length(a),type="S") 这会造成混乱,因为数据不是按递增顺序排列的

        如果你这样做了
        oo&lt;-order(a)
        plot(a[oo],rank(a[oo])/length(a),type="S")
        或者干脆
        oo&lt;-order(a)
        plot(a[oo],(1:length(a))/length(a)),type="S")
        你会得到一张 CDF 的折线图。

        我敢打赌你在考虑排名。

        【讨论】:

        • 啊……我现在明白了。 order() 以排序顺序返回向量的索引。太好了,非常感谢。
        • order(a, decreasing = T)rank(a) 将返回等效的答案。
        • 我的订单有问题。 a&lt;-c(4,2,1,80,13) 然后order(a) 应该是3 4 5 1 2,但奇怪的是我得到3 2 1 5 4
        • @duffymo 在这里提供一点帮助将不胜感激。 rankorder 什么时候相同?
        • 实际上,order(order(a)) 将返回与rank(a) 相同的结果 如果 没有关系。如果有,那么它将返回与rank(a, ties.method="first") 相同的值。
        【解决方案6】:

        要对一维向量或单列数据进行排序,只需调用 sort 函数并传入您的序列。

        另一方面,order函数是对数据进行排序所必需的二维数据——即收集的多列数据在矩阵或数据框中。

        Stadium Home Week Qtr Away Off Def Result       Kicker Dist
        751     Out  PHI   14   4  NYG PHI NYG   Good      D.Akers   50
        491     Out   KC    9   1  OAK OAK  KC   Good S.Janikowski   32
        702     Out  OAK   15   4  CLE CLE OAK   Good     P.Dawson   37
        571     Out   NE    1   2  OAK OAK  NE Missed S.Janikowski   43
        654     Out  NYG   11   2  PHI NYG PHI   Good      J.Feely   26
        307     Out  DEN   14   2  BAL DEN BAL   Good       J.Elam   48
        492     Out   KC   13   3  DEN  KC DEN   Good      L.Tynes   34
        691     Out  NYJ   17   3  BUF NYJ BUF   Good     M.Nugent   25
        164     Out  CHI   13   2   GB CHI  GB   Good      R.Gould   25
        80      Out  BAL    1   2  IND IND BAL   Good M.Vanderjagt   20
        

        这里是 2008 年 NFL 赛季投篮尝试数据的摘录,我称之为“fg”的数据框。假设这 10 个数据点代表了 2008 年尝试的所有投篮目标;进一步假设你想知道当年最长射门的距离,谁踢的,好不好;您还想知道第二长的,以及第三长的等等;最后你想要最短的射门次数。

        好吧,你可以这样做:

        sort(fg$Dist, decreasing=T)
        

        返回:50 48 43 37 34 32 26 25 25 20

        这是正确的,但不是很有用——它确实告诉我们最长的投篮尝试的距离,第二长的,......以及最短的距离;然而,但这就是我们所知道的——例如,我们不知道踢球者是谁,尝试是否成功等。当然,我们需要在“Dist”列上排序的整个数据帧(换句话说,我们想要对单个属性 Dist 上的所有数据行进行排序。 看起来像这样:

        Stadium Home Week Qtr Away Off Def Result       Kicker Dist
        751     Out  PHI   14   4  NYG PHI NYG   Good      D.Akers   50
        307     Out  DEN   14   2  BAL DEN BAL   Good       J.Elam   48
        571     Out   NE    1   2  OAK OAK  NE Missed S.Janikowski   43
        702     Out  OAK   15   4  CLE CLE OAK   Good     P.Dawson   37
        492     Out   KC   13   3  DEN  KC DEN   Good      L.Tynes   34
        491     Out   KC    9   1  OAK OAK  KC   Good S.Janikowski   32
        654     Out  NYG   11   2  PHI NYG PHI   Good      J.Feely   26
        691     Out  NYJ   17   3  BUF NYJ BUF   Good     M.Nugent   25
        164     Out  CHI   13   2   GB CHI  GB   Good      R.Gould   25
        80      Out  BAL    1   2  IND IND BAL   Good M.Vanderjagt   20
        

        这就是 order 所做的。 对二维数据进行“排序”;换句话说,它返回一个由行号组成的一维整数索引,以便根据该向量对行进行排序,将为您在列上提供正确的面向行的排序,Dist

        这是它的工作原理。上面,sort 用于对 Dist 列进行排序;为了对 Dist 列上的整个数据框进行排序,我们使用 'order' 与上面使用的 'sort' 完全相同

        ndx = order(fg$Dist, decreasing=T)
        

        (我通常将'order'返回的数组绑定到变量'ndx',它代表 对于'index',因为我打算将它用作索引数组进行排序。)

        这是第 1 步,这里是第 2 步:

        'ndx','sort' 返回的内容然后用作索引数组以重新排序数据帧'fg':

        fg_sorted = fg[ndx,]
        

        fg_sorted 是上面重新排序的数据帧。

        总之,'sort' 用于创建一个索引数组(它指定要排序的列的排序顺序),然​​后将其用作索引数组来重新排序数据帧(或矩阵)。

        【讨论】:

        • -1:顺序对于向量来说非常有意义。 order 的基本属性——a[order(a)] 是有序的——没有明确说明。
        • 错了。你需要再看一遍——“基本属性”确实在上面的两行(灰色背景)代码中显示得很清楚。因为带有“顺序”的排序是两个独立的操作,所以我使用两行代码展示了这一点——一个创建索引向量,第二行使用该索引执行排序。 OP 要求解释而不仅仅是结果,我给了他一个,这从他选择了我的答案并在上面写了简短的注释“谢谢 [m] 非常有意义”这一事实就证明了这一点。我什至将最终结果绑定到一个名为“fg_sorted”的变量。
        【解决方案7】:

        (我认为在这里非常简单地列出这些想法可能会有所帮助,以总结@doug 发布的好材料,并由@duffymo 链接;顺便说一句,+1。)

        ?order 告诉你原始向量的哪个元素需要放在第一位、第二位等,以便对原始向量进行排序,而?rank 告诉你哪个元素最低、第二低等等。 , 价值。例如:

        > a <- c(45, 50, 10, 96)
        > order(a)  
        [1] 3 1 2 4  
        > rank(a)  
        [1] 2 3 1 4  
        

        所以order(a) 说,'排序时将第三个元素放在第一位',而rank(a) 说,'第一个元素是第二低的......'。 (请注意,他们都同意哪个元素最低,等等;他们只是以不同的方式呈现信息。)因此我们看到我们可以使用order() 进行排序,但我们不能这样使用rank()

        > a[order(a)]  
        [1] 10 45 50 96  
        > sort(a)  
        [1] 10 45 50 96  
        > a[rank(a)]  
        [1] 50 10 45 96  
        

        一般来说,order() 不会等于 rank(),除非向量已经排序:

        > b <- sort(a)  
        > order(b)==rank(b)  
        [1] TRUE TRUE TRUE TRUE  
        

        此外,由于order()(基本上)在数据的等级上运行,您可以在不影响信息的情况下组合它们,但反过来会产生乱码:

        > order(rank(a))==order(a)  
        [1] TRUE TRUE TRUE TRUE  
        > rank(order(a))==rank(a)  
        [1] FALSE FALSE FALSE  TRUE  
        

        【讨论】:

        • orderrank 实际上是彼此的倒数(至少只要 a 中的值是唯一的)。如果您想象每个标签的值都有名称(/标签)('1','2','3','4'),那么order(a) 的值会告诉您rank(a) 中每个标签出现的位置(例如order(a) (3) 的第一个值告诉你'1' 出现在rank(a) 的第三个位置,反之亦然(例如rank(a) (3) 的第二个值告诉你'2' 出现在order(a)) 的第三个位置。它们是逆排列:rank(order(a)) = order(rank(a)) = 1 2 3 4
        • "?order 告诉你原始向量的哪个元素需要放在第一位、第二位等,以便对原始向量进行排序,而 ?rank 告诉你哪个元素最低、第二最低等,价值。”那里。这就是所有人不得不说的。最后。谢谢!!
        • 简洁解释.. what one need "?order 告诉你原始向量的哪个元素需要放在第一位、第二位等,以便对原始向量进行排序,而 ?rank 告诉你哪个元素具有最低、次低等值。"
        猜你喜欢
        • 2020-05-11
        • 2020-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多