了解 order() 函数

Understanding the order() function

提问人:jeffshantz 提问时间:2/23/2010 最后编辑:Petter Fribergjeffshantz 更新时间:1/17/2020 访问量:160665

问:

我正在尝试了解该函数的工作原理。我的印象是它返回了索引的排列,在排序时,将对原始向量进行排序。order()

例如

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

我本来希望这会返回,因为排序的列表将是 10 45 50 96。c(2, 3, 1, 4)

有人可以帮我理解这个函数的返回值吗?

排序 R-FAQ

评论


答:

105赞 duffymo 2/23/2010 #1

这似乎可以解释它。

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

您可能一直在寻找 ,它返回 的 元素





所以告诉你数字的顺序,告诉你如何让它们按升序排列。
rankR> a <- c(4.1, 3.2, 6.1, 3.1)R> order(a)[1] 4 2 1 3R> rank(a)[1] 3 2 4 1rankorder

plot(a, rank(a)/length(a))将给出 CDF 的图表。但是,要了解为什么有用,请尝试这样做会造成混乱,因为数据没有按递增顺序排列orderplot(a, rank(a)/length(a),type="S")

如果你这样做了


,或者只是


你会得到一个CDF的折线图。
oo<-order(a)plot(a[oo],rank(a[oo])/length(a),type="S")oo<-order(a)plot(a[oo],(1:length(a))/length(a)),type="S")

我敢打赌你正在考虑排名。

评论

8赞 jeffshantz 2/23/2010
啊..我现在明白了。order() 按排序顺序返回向量的索引。太好了,非常感谢。
0赞 omar 5/24/2016
order(a, decreasing = T)并将返回等效的答案。rank(a)
0赞 Shoham Debnath 5/27/2016
我的订单有问题。 然后应该是,但奇怪的是,我得到了a<-c(4,2,1,80,13)order(a)3 4 5 1 23 2 1 5 4
1赞 Shoham Debnath 5/27/2016
@duffymo在这里提供一点帮助将不胜感激。什么时候是和一样?rankorder
0赞 jac 8/10/2016
实际上,将返回与没有联系相同的结果。如果有,则返回与 相同的结果。order(order(a))rank(a)rank(a, ties.method="first")
34赞 doug 2/23/2010 #2

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

另一方面,顺序函数对于维数据(即在矩阵或数据帧中收集的多列数据)进行排序是必要的。

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”列上对整个 DataFrame 进行排序(换句话说,我们希望对单个属性 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

这就是秩序的作用。它是二维数据的“排序”;换句话说,它返回一个由行号组成的一维整数索引,这样根据该向量对行进行排序,就会对列 Dist 进行正确的面向行的排序

这是它的工作原理。上面,sort 用于对 Dist 列进行排序;要对 Dist 列上的整个 DataFrame 进行排序,我们使用 'order' 的方式与上面的 'sort' 使用方式完全相同

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

(我通常将从“order”返回的数组绑定到变量“ndx”,该变量是 对于“index”,因为我将使用它作为索引数组进行排序。

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

'ndx',然后将 'sort' 返回的内容用作索引数组,以对 DataFrame 'fg' 重新排序

fg_sorted = fg[ndx,]

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

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

评论

2赞 Jyotirmoy Bhattacharya 2/23/2010
-1:顺序对于向量来说很有意义。order 的基本属性——a[order(a)] 是排序的——没有明确说明。
3赞 doug 4/4/2010
错。您需要再看一遍 - “基本属性”确实在上面的两行(灰色背景)代码中显示得非常清楚。因为使用“order”进行排序是两个独立的操作,所以我使用两行代码来演示这一点——一行创建索引向量,第二行使用该索引执行排序。OP 要求解释而不仅仅是一个结果,我给了他一个解释,他选择了我的答案并在上面写下了简短的注释“谢谢 [m]akes perfect sense”就证明了这一点。我甚至将最终结果绑定到一个名为“fg_sorted”的变量。
26赞 gung - Reinstate Monica 2/25/2013 #3

(我认为在这里非常简单地列出这些想法可能会有所帮助,以总结@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  

评论

1赞 Glen_b 9/27/2013
order并且实际上是彼此的反数(至少只要 中的值是唯一的)。如果你想象每个标签的值都有名称(/label)('1','2','3','4'),那么 的值告诉你每个标签中的位置(例如,(3) 的第一个值告诉你 '1' 出现在 的第三个位置,反之亦然(例如,(3) 的第二个值告诉你 '2' 出现在 的第三个位置)。它们是逆排列:rankaorder(a)rank(a)order(a)rank(a)rank(a)order(a)rank(order(a)) = order(rank(a)) = 1 2 3 4
0赞 Aleksandr Hovhannisyan 12/30/2017
“order 告诉你原始向量的哪个元素需要放在第一位、第二位等,以便对原始向量进行排序,而 ?rank 告诉你哪个元素的值最低、第二低,等等。”那里。这就是任何人不得不说的。最后。谢谢!!
0赞 KaLi 3/6/2018
简明扼要地解释..“order 告诉你原始向量的哪个元素需要放在第一位、第二位等,以便对原始向量进行排序,而 ?rank 告诉你哪个元素的值最低、第二低,等等。
9赞 kazuwal 9/24/2016 #4

运行这一小段代码使我能够理解订单函数

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

评论

1赞 Rich Scriven 9/24/2016
结果与输入不匹配。您一定在 中使用了不同的 。xcbind()
0赞 kazuwal 9/24/2016
对上述意见作了修正。希望这对:)有所帮助
2赞 Alejandro Carrera 5/23/2017 #5

这可能会在某些时候为您提供帮助。

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

你得到的是

[1] 10 45 50 96

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

2赞 Arnab Jana 8/9/2017 #6

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

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

0赞 Nick Nassuphis 1/17/2020 #7

它们相似但不相同

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),]

评论

0赞 Nick Nassuphis 1/18/2020
秩是顺序的逆排列:始终为真。有些排列是它们自己的逆排列,但大多数不是。 对排列进行排序的逆序排列是 rank()。这就解释了为什么它们有时是相同的,而其他的则不是。all(x==x[order(x)][rank(x)])