Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解order()函数_R_Sorting_R Faq - Fatal编程技术网

理解order()函数

理解order()函数,r,sorting,r-faq,R,Sorting,R Faq,我试图理解order()函数是如何工作的。我的印象是,它返回了一个索引排列,排序后,将对原始向量进行排序 比如说, > a <- c(45,50,10,96) > order(a) [1] 3 1 2 4 >订单(a) [1] 3 1 2 4 我希望它返回c(2,3,1,4),因为排序的列表是10 45 50 96 有人能帮我理解这个函数的返回值吗?似乎解释了这一点 order的定义是a[order(a)]在 递增顺序。这适用于您的示例,其中 顺序是第四、第二、第一、第三个

我试图理解
order()
函数是如何工作的。我的印象是,它返回了一个索引排列,排序后,将对原始向量进行排序

比如说,

> a <- c(45,50,10,96)
> order(a)
[1] 3 1 2 4
>订单(a)
[1] 3 1 2 4
我希望它返回
c(2,3,1,4)
,因为排序的列表是10 45 50 96

有人能帮我理解这个函数的返回值吗?

似乎解释了这一点

order
的定义是
a[order(a)]
在 递增顺序。这适用于您的示例,其中 顺序是第四、第二、第一、第三个元素

您可能一直在寻找
rank
,它返回 元素
R>订单(a)

[1]4 2 1 3

R>排名(a)

[1]3 2 4 1

所以
rank
告诉你数字的顺序,
order
告诉您如何按升序获取它们

绘图(a,秩(a)/长度(a))
将给出CDF的图形。看看原因
order
很有用,但是,请尝试
plot(a,rank(a)/length(a),type=“S”)
这会造成混乱,因为数据的顺序不是递增的

如果你做了

oo要对一维向量或单列数据进行排序,只需调用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
下面是2008年NFL赛季的一段数据摘录,我称之为“fg”。假设这10个数据点代表了2008年尝试的所有实地目标;进一步假设你想知道当年最长的射门距离,是谁踢的,以及射门的好坏;你还想知道第二长,以及第三长,等等。;最后,你需要最短的射门尝试

好吧,你可以这样做:

sort(fg$Dist, decreasing=T)
返回:50 48 43 37 34 32 26 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
这就是order所做的。它是对二维数据的“排序”;换句话说,它返回一个由行号组成的1D整数索引,以便根据该向量对行进行排序,可以对列Dist进行正确的面向行排序

下面是它的工作原理。上面,sort用于对Dist列进行排序;要对Dist列上的整个数据帧进行排序,我们使用的“order”与上面使用的“sort”完全相同:

(我通常将从“order”返回的数组绑定到变量“ndx”,它代表 对于“index”,因为我将使用它作为索引数组进行排序。)

这是第一步,这是第二步:

“ndx”,然后将“sort”返回的内容用作索引数组,对数据帧“fg”重新排序:

fg_sorted = fg[ndx,]
fg_sorted是紧挨着上面重新排序的数据帧

总之,“sort”用于创建一个索引数组(指定要排序的列的排序顺序),然后作为索引数组对数据帧(或矩阵)重新排序。

(我认为在这里简单地列出这些想法可能会有帮助,以总结@doug发布的好材料,并通过@duffymo;+1相互链接,顺便说一句。)

告诉您原始向量的哪个元素需要放在第一位、第二位等,以便对原始向量进行排序,而告诉您哪个元素的值最低、第二位最低等。例如:

> a <- c(45, 50, 10, 96)
> order(a)  
[1] 3 1 2 4  
> rank(a)  
[1] 2 3 1 4  
通常,
order()
不等于
rank()
,除非向量已经排序:

> b <- sort(a)  
> order(b)==rank(b)  
[1] TRUE TRUE TRUE TRUE  

运行这段代码可以让我理解order函数

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

x这在某种程度上可以帮助您

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

我写的代码表明您希望将“a”作为“a”的一个整体子集,并希望将其从最低值到最高值排序。

简单地说,
order()
给出了数量级不断增加的元素的位置

例如,
顺序(c(10,20,30))
将给出1,2,3
顺序(c(30,20,10))
将给出3,2,1

它们相似但不相同

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),]
set.seed(0)

xAhh..我现在明白了。order()以排序的顺序返回向量的索引。太好了,非常感谢。
顺序(a,递减=T)
秩(a)
将返回相同的答案。我的订单有问题。
a@duffymo这里的一点帮助将不胜感激。
rank
order
何时相同?实际上,
order(order(a))
将返回与
rank(a)相同的结果
如果没有关联。如果有关联,那么它将返回与
秩(a,ties.method=“first”)
-1:order对于向量来说非常有意义。order的基本属性(即a[order(a)]被排序)没有明确说明。错误。您需要再看一次-“基本属性”确实在这两个向量中显示得非常清楚(灰色背景)上面的代码行。因为排序w/‘order’是两个独立的操作,所以我用两行代码展示了这一点——一行创建索引向量,第二行使用该索引执行排序。OP要求解释的不仅仅是结果,我给了他一个解释,他选择了我的答案并写了简短的“否”就证明了这一点上面的“谢谢”有着完美的意义。我甚至把它绑定起来
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
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),]