了解订单()函数

问题描述:

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

例如,

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

我本来期望这回c(2, 3, 1, 4),因为排序的名单将是10 45 50 96

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

This似乎可以解释它。

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

我敢打赌你在考虑排名。

+5

啊..我现在明白了。 order()以排序顺序返回矢量的索引。非常好,非常感谢。 – jeffshantz 2010-02-23 02:27:48

+0

'order(a,decrease = T)'和'rank(a)'会返回一个等价的答案。 – omar 2016-05-24 11:10:28

+0

我有订单问题。 'a 2016-05-27 11:42:01

排序一维向量或数据的单个列,只需调用排序功能,并通过在你的序列。

在另一方面,顺序功能是必要的数据维数据进行排序。 - 即,在一个矩阵或数据帧收集的数据的多个列。

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 

这是为了确实它是二维的数据“排序”。 ;换言之,它返回由行号组成的一维整数索引,以便根据该向量对行进行排序,从而在列上给出正确的面向行的排序,D ist

下面是它的工作原理。以上,被用来排列Dist列;对DIST列中的整个数据帧进行排序,我们使用“订单” 完全相同的方式如上述使用“排序”:

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

(ⅰ通常结合在阵列从“订单”返回到可变。“NDX”,它表示 为“索引”,因为我要使用它作为索引数组排序)

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

“NDX”,什么是然后用'sort'返回,作为索引数组重新排序 dataframe,'f g':

fg_sorted = fg[ndx,] 

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

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

+2

-1:顺序对于矢量来说很有意义。订单的基本属性 - [订单(a)]排序 - 没有明确说明。 – 2010-02-23 03:32:16

+2

错误。你需要再看一遍 - “基本属性”的确在上面的两行(灰色背景)代码行中显示得非常清晰。因为排序w /'order'是两个单独的操作,我使用两行代码显示了这一点 - 一个创建索引向量,第二行使用该索引执行排序。 OP要求解释的不仅仅是一个结果,而且我给了他一个,他证明了他选择了我的答案,并在“Thanks [m] akes perfect sense”上面写了简短说明。我甚至将最终结果绑定到一个名为“fg_sorted”的变量。 – doug 2010-04-03 16:19:41

(我想这可能是有益的非常简单地在这里奠定了思想总结好材料张贴@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

'order'和'rank'实际上是相互颠倒的(至少只要'a'中的值是唯一的)。如果你想象它们的值都有名称(/标签)('1','2','3','4'),那么'order(a)'的值告诉你'rank(a )'每个标签都出现在(例如(a)'(3)的第一个值告诉你'rank(a)'的第三个位置出现'1',反之亦然(例如rank(a)'(3)的第二个值)告诉你'2'出现在'order(a)''的第三个位置。它们是相反的排列:“order(order(a))'='order(rank(a))'='1 2 3 4'' – 2013-09-27 06:43:27

+0

”?order告诉你哪个原始矢量元素需要先放置,第二等,以便对原始矢量进行排序,而?rank指示哪个元素具有最低,第二低等等值。“那里。这是所有人都必须说的。最后。谢谢!! – AleksandrH 2017-12-29 21:03:32

+0

简洁地解释了......需要什么“?”顺序告诉你哪个原始矢量的哪个元素需要被放置第一,第二等,以便对原始矢量进行排序,而?rank告诉你哪个元素具有最低,第二最低值等。“ – sKaLiDhAsAn 2018-03-06 06:25:45

运行这一小段代码让我明白的顺序功能

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

结果与输入不匹配。你必须在'cbind()'中使用另一个'x'。 – 2016-09-23 21:51:15

+0

关于上述评论修改。希望这可以帮助 :) – adebesin 2016-09-24 12:38:18

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

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

你得到的是

[1] 10 45 50 96 

我写的代码表示想要“一”作为一个整体子集“一”,你希望它从最低责令最高值。

简而言之,order()给出了增加幅度的元素的位置。

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