我试图了解order()
函数的工作原理。我的印象是它返回了索引的排列,在排序时会对原始向量进行排序。
例如,
> a <- c(45,50,10,96)
> order(a)
[1] 3 1 2 4
我原本希望这会返回c(2, 3, 1, 4)
,因为排序的列表是10 45 50 96.
有人可以帮我理解这个函数的返回值吗?
答案 0 :(得分:90)
This似乎在解释它。
order
的定义是a[order(a)]
所在 增加秩序。这适用于您的示例,其中正确 order是第四个,第二个,第一个,然后是第三个元素。您可能一直在寻找
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的折线图。
我敢打赌你在考虑排名。
答案 1 :(得分:31)
要对1D向量或单列数据进行排序,只需调用 排序 函数并传入序列。
另一方面, 订单 功能是分组数据两个维数据所必需的 - 即收集多列数据在矩阵或数据框中。
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
这就是订单的作用。这是二维数据的'排序';换句话说,它返回一个由行号组成的1D整数索引,以便根据该向量对行进行排序,从而在列上为您提供正确的面向行的排序, Dist
这是它的工作原理。上面, sort 用于对Dist列进行排序;要对Dist列上的整个数据框进行排序,我们使用'order'与上面使用'sort'的方式完全相同:
ndx = order(fg$Dist, decreasing=T)
(我通常将从'order'返回的数组绑定到变量'ndx',后者代表 对于'index',因为我将它用作索引数组来进行排序。)
这是第1步,这是第2步:
'ndx','sort'返回的内容随后被用作重新排序数据框的索引数组'fg':
fg_sorted = fg[ndx,]
fg_sorted是紧接在上面的重新排序的数据帧。
总之,'sort'用于创建索引数组(指定要排序的列的排序顺序),然后将其用作索引数组以重新排序数据框(或矩阵)。 / p>
答案 2 :(得分:18)
(我认为在这里简单地概述这些想法可能有助于总结@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
答案 3 :(得分:6)
运行这一小段代码让我理解了订单功能
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
答案 4 :(得分:2)
这可以在某些时候帮助你。
a <- c(45,50,10,96)
a[order(a)]
你得到的是
[1] 10 45 50 96
我写的代码表明你想要“a”作为“a”的整个子集,并且你希望它从最低到最高值排序。
答案 5 :(得分:1)
简单来说,order()
给出了幅度越来越大的元素的位置。
例如,order(c(10,20,30))
会提供 1,2,3 和
order(c(30,20,10))
会提供 3,2,1 。