理解order()函数

jef*_*ntz 81 sorting r r-faq

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

例如,

> a <- c(45,50,10,96)
> order(a)
[1] 3 1 2 4
Run Code Online (Sandbox Code Playgroud)

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

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

duf*_*ymo 93

似乎可以解释它.

的定义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的折线图.

我打赌你在考虑排名.

  • 啊......我现在明白了.order()以排序顺序返回向量的索引.太棒了,非常感谢. (8认同)

dou*_*oug 32

要对1D向量或单列数据进行排序,只需调用sort函数并传入序列.

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

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
Run Code Online (Sandbox Code Playgroud)

以下是2008年NFL赛季投篮数据的摘录,这是一个我称之为"fg"的数据帧.假设这10个数据点代表了2008年尝试的所有实地目标; 进一步假设你想知道那一年尝试的最长射门次数的距离,踢球的距离以及是否好的; 你也想知道第二长,第三长,等等.最后你想要最短的射门尝试.

好吧,你可以这样做:

sort(fg$Dist, decreasing=T)
Run Code Online (Sandbox Code Playgroud)

返回: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
Run Code Online (Sandbox Code Playgroud)

这就是订单的作用.它是二维数据的"排序"; 换一种说法,它返回由行号这样的一维整数索引排序行根据该矢量,会给你的专栏,正确的面向行的排序DIST

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

ndx = order(fg$Dist, decreasing=T)
Run Code Online (Sandbox Code Playgroud)

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

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

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

fg_sorted = fg[ndx,]
Run Code Online (Sandbox Code Playgroud)

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

总而言之,'sort'用于创建索引数组(指定要排序的列的排序顺序),然​​后将其用作索引数组以重新排序数据框(或矩阵).

  • -1:顺序对于矢量非常有意义.订单的基本属性 - [订单(a)]的排序 - 没有明确说明. (2认同)
  • 错误.你需要重新审视 - "基本属性"确实在上面的两行(灰色背景)行中非常清楚地显示出来.因为排序w /'order'是两个独立的操作,我使用两行代码展示了这一点 - 一个创建索引向量,第二行使用该索引来执行排序.OP要求解释不仅仅是一个结果,我给了他一个,这可以从他选择我的答案并写上面的简短说明"谢谢[m]完美感"这一事实得到证明.我甚至将最终结果绑定到一个名为"fg_sorted"的变量. (2认同)

gun*_*ica 20

(我认为在这里简单地概述这些想法可能有助于总结@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  
Run Code Online (Sandbox Code Playgroud)

所以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  
Run Code Online (Sandbox Code Playgroud)

通常,除非已经对矢量进行了排序,否则order()它将不相等rank():

> b <- sort(a)  
> order(b)==rank(b)  
[1] TRUE TRUE TRUE TRUE  
Run Code Online (Sandbox Code Playgroud)

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

> order(rank(a))==order(a)  
[1] TRUE TRUE TRUE TRUE  
> rank(order(a))==rank(a)  
[1] FALSE FALSE FALSE  TRUE  
Run Code Online (Sandbox Code Playgroud)


ade*_*sin 7

运行这一小段代码让我理解了订单功能

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
Run Code Online (Sandbox Code Playgroud)

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