94

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

例如,

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

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

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

4

7 回答 7

104

似乎可以解释它。

的定义ordera[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 的折线图。

我敢打赌你在考虑排名。

于 2010-02-23T01:46:40.260 回答
33

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

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

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

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

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

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

fg_sorted = fg[ndx,]

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

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

于 2010-02-23T02:30:08.027 回答
26

(我认为在这里非常简单地列出这些想法可能会有所帮助,以总结@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  
于 2013-02-25T01:41:03.697 回答
9

运行这段小代码让我理解了 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

于 2016-09-23T21:33:46.643 回答
2

这可以在某些时候帮助你。

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

你得到的是

[1] 10 45 50 96

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

于 2017-05-23T00:50:21.610 回答
2

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

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

于 2017-08-09T07:28:23.183 回答
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),]
于 2020-01-17T00:08:39.103 回答