我想理解 order()
函数的工作原理。我以为它会返回一个索引的置换,使得排序这些索引后可以对原始向量进行排序。
例如:
> a <- c(45,50,10,96)
> order(a)
[1] 3 1 2 4
我本来期望这个函数返回c(2, 3, 1, 4)
,因为按顺序排列后的列表应该是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
告诉你如何按升序排列他们。
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线图。
我打赌你在想rank。
要对一维向量或单列数据进行排序,只需调用sort函数并传入您的序列。
另一方面,order函数则是必要的,用于对二维数据进行排序 - 即,在矩阵或数据框中收集的多列数据。
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
sort(fg$Dist, decreasing=T)
这是正确的,但并不是非常有用——它告诉我们最长的足球场进攻的距离、第二长的距离,以及最短的距离;但是,这就是我们所知道的全部——例如,我们不知道踢球者是谁,尝试是否成功等。当然,我们需要按“Dist”列对整个数据框进行排序(换句话说,我们想在单个属性 Dist 上对所有数据行进行排序)。 它看起来像这样:
返回结果: 50 48 43 37 34 32 26 25 25 20
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
ndx = order(fg$Dist, decreasing=T)
通常我会将从'order'返回的数组绑定到变量'ndx'上,它代表'index',因为我将使用它作为索引数组进行排序。
这是第一步,接下来是第二步:
'sort'返回的'ndx'被用作索引数组来重新排序数据框'fg':
fg_sorted = fg[ndx,]
fg_sorted是上面立即重新排序的数据帧。
总之,'sort'用于创建索引数组(指定要排序的列的排序顺序),然后将其用作索引数组以重新排序数据帧(或矩阵)。
> 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
和rank
实际上是彼此的反函数(至少在a
中的值是唯一的情况下)。如果你想象每个都有名字(/标签)('1','2','3','4'),那么order(a)
的值告诉您每个标签在rank(a)
中出现的位置(例如,order(a)
的第一个值(3)告诉您'1'出现在rank(a)
的第3个位置,反之亦然(例如,rank(a)
的第二个值(3)告诉您'2'出现在order(a)
的第3个位置)。它们是反置换:rank(order(a)) = order(rank(a)) = 1 2 3 4
。 - Glen_bx <- 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
cbind()
中使用了不同的 x
。 - Rich Scriven简单来说,order()
函数会返回元素按大小排序后的位置。
例如,order(c(10,20,30))
将会返回 1,2,3,而 order(c(30,20,10))
将会返回 3,2,1。
a <- c(45,50,10,96)
a[order(a)]
[1] 10 45 50 96
它们相似但不完全相同。
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)])
总是成立的。有些排列是它们自己的逆置,但大多数不是。从 order() 出来的排序排列的逆置是 rank()。这就解释了为什么它们有时相同,有时不同。 - Nick Nassuphis
order(a, decreasing = T)
和rank(a)
将返回相同的答案。 - omara<-c(4,2,1,80,13)
然后order(a)
应该是3 4 5 1 2
,但奇怪的是我得到了3 2 1 5 4
。 - Shoham Debnathrank
和order
是相同的? - Shoham Debnathorder(order(a))
将返回与rank(a)
相同的结果。如果有,并列情况,它将返回与rank(a, ties.method="first")
相同的结果。 - jacs = sort(a)
,我们能否说:s == a[order(a)]
,并且在没有平局的情况下,a == s[rank(a)]
?(不确定R语法) - djvg