order () 함수 이해


88

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

예를 들어

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

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

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

답변:


100

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

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

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


8
아 .. 이제 알겠습니다. order ()는 정렬 된 순서로 벡터의 인덱스를 반환합니다. 훌륭합니다. 감사합니다.
jeffshantz

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
Shoham Debnath

1
@duffymo 여기에 약간의 도움을 주시면 정말 감사하겠습니다. 언제 rankorder같은?
Shoham Debnath

사실, order(order(a))같은를 반환 rank(a) 하는 경우 에는 관계가 없다. 있는 경우와 동일하게 반환됩니다 rank(a, ties.method="first").
jac

33

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"열에 정렬 된 전체 데이터 프레임이 필요합니다. 단일 속성 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 에서 올바른 행 지향 정렬이 제공됩니다.

작동 방식은 다음과 같습니다. 이상은, 일종의 dist 파일 컬럼을 정렬하는 데 사용되었다; Dist 열에서 전체 데이터 프레임을 정렬하기 위해 위에서 'sort'가 사용 된 것과 동일한 방식으로 ' order '를 사용합니다 .

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

(보통 'order'에서 반환 된 배열을 'index'를 나타내는 변수 'ndx'에 바인딩합니다. 왜냐하면 정렬을 위해 인덱스 배열로 사용할 것이기 때문입니다.)

1 단계 였고 2 단계입니다.

'ndx', 'sort'에 의해 반환 된 것은 데이터 프레임 'fg' 를 재정렬하기 위한 인덱스 배열로 사용됩니다 .

fg_sorted = fg[ndx,]

fg_sorted는 바로 위에 재정렬 된 데이터 프레임입니다.

요약하면 '정렬'은 인덱스 배열 (정렬하려는 열의 정렬 순서를 지정)을 생성하는 데 사용되며, 데이터 프레임 (또는 행렬)을 재정렬하기위한 인덱스 배열로 사용됩니다.


2
-1 : 순서는 벡터에 매우 적합합니다. a [order (a)]가 정렬 된 순서의 기본 속성은 명확하게 명시되어 있지 않습니다.
Jyotirmoy Bhattacharya

2
잘못된. 다시 살펴 봐야합니다. '기본 속성'은 실제로 위의 두 줄 (회색 배경) 코드에서 매우 명확하게 표시됩니다. '순서'를 사용한 정렬은 두 개의 개별 작업이므로 두 줄의 코드를 사용하여 이것을 보여주었습니다. 하나는 인덱스 벡터를 만들고 두 번째 줄은 정렬을 수행하는 데 사용합니다. OP는 단순한 결과가 아닌 설명을 요청했고, 그가 내 대답을 선택하고 "감사합니다. 완벽한 의미가 있습니다"위에 간단한 메모를 썼다는 사실에서 알 수 있듯이 그에게 하나를주었습니다. 최종 결과를 "fg_sorted"라는 변수에 바인딩했습니다.
doug

24

(@doug가 게시하고 @duffymo가 링크 한 좋은 자료를 요약하기 위해 여기에 아주 간단하게 아이디어를 배치하는 것이 도움이 될 것이라고 생각했습니다. 각각에 +1, btw.)

? 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  

1
order그리고 rank실제로는 서로 반대입니다 (적어도의 값 a이 고유 한 경우). 각각의 값에 이름 (/ 레이블) ( '1', '2', '3', '4')이 있다고 상상하면의 값은 각 레이블의 order(a)위치 rank(a)(예 : 첫 번째 값)를 알려줍니다. order(a)(3)은 '1'이의 3 번째 위치에서 발생 rank(a)하고 그 반대의 경우도 마찬가지입니다 (예 : rank(a)(3) 의 2 번째 값은 '2'가의 3 번째 위치에서 발생 함을 나타냅니다 order(a)). 그들은 역순 열입니다 : rank(order(a))= order(rank(a))=1 2 3 4
Glen_b

"? order는 원래 벡터를 정렬하기 위해 원래 벡터의 어떤 요소를 첫 번째, 두 번째 등으로 배치해야 하는지를 알려주는 반면,? rank는 어떤 요소가 가장 낮은 값, 두 번째로 낮은 값 등을 갖는지 알려줍니다." 그곳에. 그게 모든 사람이 말한 것입니다. 드디어. 감사합니다!!
AleksandrH

간결하게 설명 .. 무엇이 필요한지 "? order는 원래 벡터를 정렬하기 위해 원래 벡터의 어떤 요소를 첫 번째, 두 번째 등으로 넣어야 하는지를 알려주는 반면,? rank는 어떤 요소가 가장 낮고 두 번째로 낮은지를 알려줍니다. 등, 가치. "
sHiBuKaLiDhAsAn

9

이 작은 코드를 실행하면 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

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


1
결과가 입력과 일치하지 않습니다. 당신은 다른 사용해야합니다 x의를 cbind().
Rich Scriven

위의 의견과 관련하여 수정되었습니다. 희망이 도움이 :)
adebesin

2

이것은 어느 시점에서 당신을 도울 수 있습니다.

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

당신이 얻는 것은

[1] 10 45 50 96

내가 작성한 코드는 "a"를 "a"의 전체 하위 집합으로 원하고 가장 낮은 값에서 가장 높은 값으로 정렬하기를 원한다는 것을 나타냅니다.


2

간단히 말해서 order() 증가하는 요소의 위치를 ​​제공합니다.

예를 들어, order(c(10,20,30))줄 것이다 1,2,3order(c(30,20,10))줄 것이다 3,2,1을 .


0

비슷하지만 같지는 않다

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.