理解order()函数

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

例如,

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

我会期望这返回c(2, 3, 1, 4) ,因为sorting的列表将是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是有用的,尽pipe试图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的折线图。

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

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

另一方面, 顺序函数对于数据二维数据的sorting是必要的,即在matrix或dataframe中收集多列数据。

 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”列上sorting(换句话说,我们想要对单个属性Dist中的所有数据行进行sorting,如下所示:

 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 

这是命令的作用。 二维数据是“sorting”的; 换一种说法,它返回一个由行号组成的一维整数索引,这样根据这个向量对行进行sorting,会给你一个正确的面向行的sorting, Dist

这是如何工作的。 上面的sorting是用来排列Dist列的; 要对Dist列上的整个数据框进行sorting,我们使用'order' 与上面使用'sort'的方式完全相同

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

(我通常将从'order'返回的数组绑定到variables'ndx',它代表'index',因为我打算将它用作索引数组进行sorting。

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

'ndx','sort'返回的内容被用作索引数组来重新sortingdataframe'fg':

 fg_sorted = fg[ndx,] 

fg_sorted是紧接在上面的重新sorting的dataframe。

总而言之,'sort'用于创build一个索引数组(指定要sorting的列的sorting顺序),然​​后将其用作索引数组来重新sortingdataframe(或matrix)。

(我认为在这里简单地列出想法可能会有所帮助,以总结由@doug发布的优质材料,并通过@duffymo;链接到每个btw。

?order告诉你哪个原始vector的元素需要被放置第一,第二等,以便对原始vector进行sorting,而?rank告诉你哪个元素具有最低,第二最低等等的值。 例如:

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

所以order(a)是:“sorting时把第三个元素排在第一位”,而rank(a)则是说“第一个元素排在第二位……”。 (注意它们都同意哪个元素是最低的,等等,它们只是呈现不同的信息)。因此,我们看到我们可以使用order()来sorting,但是我们不能使用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已经被sorting:

 > 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 

运行这一小段代码,让我了解顺序function

 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

这可以帮助你。

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

你得到的是

 [1] 10 45 50 96 

我写的代码表明你想要“a”作为“a”的整个子集,并且你希望它从最低到最高值sorting。

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

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