developer tip

order () 함수 이해

copycodes 2020. 10. 14. 07:56
반응형

order () 함수 이해


order()기능 이 어떻게 작동 하는지 이해하려고 합니다. 나는 그것이 정렬 될 때 원래 벡터를 정렬 할 인덱스의 순열을 반환한다는 인상을 받았다.

예를 들어

> a <- c(45,50,10,96)
> order(a)
[1] 3 1 2 4

c(2, 3, 1, 4)정렬 된 목록이 10 45 50 96이기 때문에이 반환 될 것으로 예상했을 것입니다.

누군가이 함수의 반환 값을 이해하도록 도울 수 있습니까?


이것은 그것을 설명하는 것 같습니다.

의 정의 orderIS 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의 선 그래프를 얻습니다.

계급을 생각하고 계실 거에요.


1D 벡터 또는 단일 데이터 열을 정렬하려면 sort 함수를 호출하고 시퀀스를 전달 하면 됩니다.

반면에 order 함수는 데이터를 2 차원 데이터, 즉 행렬 또는 데이터 프레임에 수집 된 여러 열의 데이터 를 정렬하는 데 필요합니다 .

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 의 모든 데이터 행을 정렬하려고합니다 .

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

이것이 주문 이하는 일입니다. 2 차원 데이터의 경우 '정렬'입니다. 즉, 행 번호로 구성된 1D 정수 인덱스를 반환하여 해당 벡터에 따라 행을 정렬하면 열 Dist 에서 올바른 행 지향 정렬이 제공됩니다.

Here's how it works. Above, sort was used to sort the Dist column; to sort the entire dataframe on the Dist column, we use 'order' exactly the same way as 'sort' is used above:

ndx = order(fg$Dist, decreasing=T)

(i usually bind the array returned from 'order' to the variable 'ndx', which stands for 'index', because i am going to use it as an index array to sort.)

that was step 1, here's step 2:

'ndx', what is returned by 'sort' is then used as an index array to re-order the dataframe, 'fg':

fg_sorted = fg[ndx,]

fg_sorted is the re-ordered dataframe immediately above.

In sum, 'sort' is used to create an index array (which specifies the sort order of the column you want sorted), which then is used as an index array to re-order the dataframe (or matrix).


(I thought it might be helpful to lay out the ideas very simply here to summarize the good material posted by @doug, & linked by @duffymo; +1 to each,btw.)

?order tells you which element of the original vector needs to be put first, second, etc., so as to sort the original vector, whereas ?rank tell you which element has the lowest, second lowest, etc., value. For example:

> a <- c(45, 50, 10, 96)
> order(a)  
[1] 3 1 2 4  
> rank(a)  
[1] 2 3 1 4  

So order(a) is saying, 'put the third element first when you sort... ', whereas rank(a) is saying, 'the first element is the second lowest... '. (Note that they both agree on which element is lowest, etc.; they just present the information differently.) Thus we see that we can use order() to sort, but we can't use rank() that way:

> a[order(a)]  
[1] 10 45 50 96  
> sort(a)  
[1] 10 45 50 96  
> a[rank(a)]  
[1] 50 10 45 96  

In general, order() will not equal rank() unless the vector has been sorted already:

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

Also, since order() is (essentially) operating over ranks of the data, you could compose them without affecting the information, but the other way around produces gibberish:

> order(rank(a))==order(a)  
[1] TRUE TRUE TRUE TRUE  
> rank(order(a))==rank(a)  
[1] FALSE FALSE FALSE  TRUE  

Running this little piece of code allowed me to understand the order 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

Reference: http://r.789695.n4.nabble.com/I-don-t-understand-the-order-function-td4664384.html


This could help you at some point.

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

What you get is

[1] 10 45 50 96

The code I wrote indicates you want "a" as a whole subset of "a" and you want it ordered from the lowest to highest value.


In simple words, order() gives the locations of elements of increasing magnitude.

For example, order(c(10,20,30)) will give 1,2,3 and order(c(30,20,10)) will give 3,2,1.

참고URL : https://stackoverflow.com/questions/2315601/understanding-the-order-function

반응형