了解order()函数

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

例如,

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

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

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


这似乎解释了它。

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告诉你这些数字的orderorder告诉你如何让它们按升序排列。

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的线形图。

我敢打赌你在考虑排名。


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

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

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列上的整个数据帧进行排序,我们使用'order'与上面使用'sort'的方式完全相同:

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

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

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

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

fg_sorted = fg[ndx,]

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

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


(我认为在这里简单介绍@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()除非vector已经被排序:

> 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  
链接地址: http://www.djcxy.com/p/24889.html

上一篇: Understanding the order() function

下一篇: `( What sorcery is this?