order()
기능 이 어떻게 작동 하는지 이해하려고 합니다. 나는 그것이 정렬 될 때 원래 벡터를 정렬 할 인덱스의 순열을 반환한다는 인상을 받았다.
예를 들어
> a <- c(45,50,10,96)
> order(a)
[1] 3 1 2 4
c(2, 3, 1, 4)
정렬 된 목록이 10 45 50 96이기 때문에이 반환 될 것으로 예상했을 것입니다.
누군가이 함수의 반환 값을 이해하도록 도울 수 있습니까?
답변:
이것은 그것을 설명하는 것 같습니다.
의 정의
order
ISa[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의 선 그래프를 얻습니다.
계급을 생각하고 계실 거에요.
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")
.
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는 바로 위에 재정렬 된 데이터 프레임입니다.
요약하면 '정렬'은 인덱스 배열 (정렬하려는 열의 정렬 순서를 지정)을 생성하는 데 사용되며, 데이터 프레임 (또는 행렬)을 재정렬하기위한 인덱스 배열로 사용됩니다.
(@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
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
이 작은 코드를 실행하면 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
x
의를 cbind()
.
비슷하지만 같지는 않다
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 ()입니다. 이것은 왜 그들이 때때로 같고 다른지 이유를 설명합니다.