理解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
告诉你数字的order
,order
告诉你如何让它们按升序排列。
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 。