提问人:jeffshantz 提问时间:2/23/2010 最后编辑:Petter Fribergjeffshantz 更新时间:1/17/2020 访问量:160665
了解 order() 函数
Understanding the order() function
问:
我正在尝试了解该函数的工作原理。我的印象是它返回了索引的排列,在排序时,将对原始向量进行排序。order()
例如
> a <- c(45,50,10,96)
> order(a)
[1] 3 1 2 4
我本来希望这会返回,因为排序的列表将是 10 45 50 96。c(2, 3, 1, 4)
有人可以帮我理解这个函数的返回值吗?
答:
这似乎可以解释它。
的定义是 增加订单。这适用于您的示例,其中正确的 顺序是第四个、第二个、第一个,然后是第三个元素。
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")
如果你这样做了
,或者只是
你会得到一个CDF的折线图。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")
我敢打赌你正在考虑排名。
评论
order(a, decreasing = T)
并将返回等效的答案。rank(a)
a<-c(4,2,1,80,13)
order(a)
3 4 5 1 2
3 2 1 5 4
rank
order
order(order(a))
rank(a)
rank(a, ties.method="first")
要对一维向量或单列数据进行排序,只需调用排序函数并传入序列即可。
另一方面,顺序函数对于二维数据(即在矩阵或数据帧中收集的多列数据)进行排序是必要的。
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”列上对整个 DataFrame 进行排序(换句话说,我们希望对单个属性 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 列上的整个 DataFrame 进行排序,我们使用 'order' 的方式与上面的 'sort' 使用方式完全相同:
ndx = order(fg$Dist, decreasing=T)
(我通常将从“order”返回的数组绑定到变量“ndx”,该变量是 对于“index”,因为我将使用它作为索引数组进行排序。
这是第 1 步,这是第 2 步:
'ndx',然后将 'sort' 返回的内容用作索引数组,以对 DataFrame 'fg' 重新排序:
fg_sorted = fg[ndx,]
fg_sorted 是紧挨着上面的重新排序的数据帧。
总之,“sort”用于创建一个索引数组(它指定要排序的列的排序顺序),然后将其用作索引数组来重新排序数据帧(或矩阵)。
评论
(我认为在这里非常简单地列出这些想法可能会有所帮助,以总结@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
评论
order
并且实际上是彼此的反数(至少只要 中的值是唯一的)。如果你想象每个标签的值都有名称(/label)('1','2','3','4'),那么 的值告诉你每个标签中的位置(例如,(3) 的第一个值告诉你 '1' 出现在 的第三个位置,反之亦然(例如,(3) 的第二个值告诉你 '2' 出现在 的第三个位置)。它们是逆排列:rank
a
order(a)
rank(a)
order(a)
rank(a)
rank(a)
order(a)
rank(order(a))
= order(rank(a))
= 1 2 3 4
运行这一小段代码使我能够理解订单函数
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
评论
x
cbind()
这可能会在某些时候为您提供帮助。
a <- c(45,50,10,96)
a[order(a)]
你得到的是
[1] 10 45 50 96
我编写的代码表明您希望“a”作为“a”的整个子集,并且希望它从最低值到最高值排序。
简单来说,给出了量级递增的元素的位置。order()
例如,将给出 1,2,3 并给出 3,2,1。order(c(10,20,30))
order(c(30,20,10))
它们相似但不相同
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),]
评论
all(x==x[order(x)][rank(x)])
评论