了解order()函数


88

我试图了解该order()功能的工作原理。我的印象是它返回了索引的排列,排序后会对原始向量进行排序。

例如,

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

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

有人可以帮助我了解此函数的返回值吗?

Answers:


100

似乎可以解释。

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

您可能一直在寻找rank,它返回元素的排名,
R> a <- c(4.1, 3.2, 6.1, 3.1)
R> order(a)
[1] 4 2 1 3
R> 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<-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")
得到CDF的折线图。

我敢打赌,您正在考虑排名。


8
啊..我现在知道了。order()以排序的顺序返回向量的索引。太好了,非常感谢。
jeffshantz 2010年

order(a, decreasing = T)rank(a)会返回一个等效的答案。
奥马尔

我的订单有问题。 a<-c(4,2,1,80,13)order(a)应该是3 4 5 1 2,但奇怪的是我得到了3 2 1 5 4
肖汉姆·德布纳特

1
@duffymo这里的一点帮助将不胜感激。什么时候rankorder一样?
Shoham Debnath

事实上,order(order(a))这将返回相同的rank(a) ,如果没有关系。如果有,它将返回与相同的结果rank(a, ties.method="first")
杰克

33

要对一维矢量或单个数据列进行排序,只需调用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

这就是命令的作用。它是对二维数据的“排序”。换句话说,它返回由行号组成的一维整数索引,以便根据该向量对行进行排序,将为列Dist提供正确的面向行的排序

运作方式如下。上面,sort用于对Dist列进行排序;为了对Dist列上的整个数据框进行排序,我们使用的“顺序”与上面使用“排序”的方式完全相同

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

(我通常将从'order'返回的数组绑定到变量'ndx',该变量代表'index',因为我将使用它作为要排序的索引数组。)

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

然后,将'sort'返回的'ndx'用作索引数组,对数据帧'fg'重新排序

fg_sorted = fg[ndx,]

fg_sorted是紧接其上方的重新排序的数据帧。

总之,“ sort”用于创建索引数组(该索引数组指定要排序的列的排序顺序),然​​后用作索引数组以对数据框(或矩阵)重新排序。


2
-1:阶对向量很有意义。订单的基本属性-对a [order(a)]进行排序-不清楚。
Jyotirmoy Bhattacharya 2010年

2
错误。您需要再次查看-上面代码的两行(灰色背景)确实非常清楚地显示了“基本属性”。由于使用“顺序”排序是两个单独的操作,因此我使用两行代码进行了展示-一行创建索引向量,另一行使用该索引执行排序。OP要求提供一种解释,而不仅仅是一种结果,我给了他一个解释,这一事实证明了他选择了我的答案,并在上面写了简短的注释:“谢谢。”。我什至将最终结果绑定到一个名为“ fg_sorted”的变量。
doug 2010年

24

(我认为在这里很简单地列出这些想法,以总结@doug发表的好材料,以及@duffymo链接的好材料可能是有帮助的; btw +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
order并且rank实际上彼此相反(至少只要ina中的值是唯一的)。如果您想象每个标签的值都有名称(/ labels)('1','2','3','4'),则的值会order(a)告诉您rank(a)每个标签在哪个位置出现(例如,order(a)(3)告诉您'1'出现在的第3个位置上rank(a),反之亦然(例如rank(a)(3)的2nd值告诉您'2'出现在的第3个位置上order(a))。它们是反排列的:rank(order(a))= order(rank(a))=1 2 3 4
Glen_b

“?order告诉您需要将原始向量的哪个元素放在第一,第二等位置,以便对原始向量进行排序,而?rank告诉您哪个元素具有最低,第二最低等值。” 那里。那就是任何人都必须说的。最后。谢谢!!
AleksandrH

简要说明..“需要什么?”顺序告诉您需要将原始向量的哪个元素放在第一,第二等,以便对原始向量进行排序,而“ rank”告诉您哪个元素具有最低,第二最低的元素,等等。”
sHiBuKaLiDhAsAn

9

运行这段小代码使我了解订单功能

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
结果与输入不匹配。您必须使用不同的xcbind()
Rich Scriven

对上述评论进行了修改。希望这会
有所

2

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

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

你得到的是

[1] 10 45 50 96

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


2

简而言之,order()给出了数量级增加的元素的位置。

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


0

它们相似但不相同

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)])始终为true。一些排列是它们自己的逆,但大多数不是。order()产生的排序置换的逆是rank()。这就解释了为什么有时它们是相同的,而其他则不是。
Nick Nassuphis
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.