2017년 12월 13일 수요일

[하루에 한 R] order() 함수의 이해

어떤 벡터가 있을 때 sort() 함수를 적용하면 그 원소들을 다음과 같이 오름차순으로 정리하여 출력한다. 내림차순으로 정동하고 싶으면 decreasing=T를 설정하면 된다.
> x = c(1,5,3,2,4)
> sort(x)
[1] 1 2 3 4 5
order() 함수는 벡터의 원소를 이 인덱스 번호순으로 놓으면 값이 정렬된다는 것을 의미한다. Character 타입의 벡터를 사용하여 설명하는 것이 이해하기 쉬울 것이다. 이를 이해한다면 아래에서 보인 마지막 명령이 무엇을 뜻하는지도 납득할 수 있다.
> y = c("a","c","e","b","c")
> sort(y)
[1] "a" "b" "c" "c" "e"
> order(y)
[1] 1 4 2 5 3ㅁㄴㅇ
> y[order(y)]
[1] "a" "b" "c" "c" "e"
order(y)를 사용하여 알 수 있는 것은 벡터 y의 원소를 값에 따라서 순서대로 나열하려면 첫번째, 네번째, 두번째, 다섯번째, 그리고 세번째 원소의 순서대로 놓으면 된다는 것이다.

order() 함수를 이용하면 행이나 열을 name에 따라서 정렬하는 것도 가능하다. 연습용 4x3 매트릭스를 만들고 colnames()로 각 열에 이름을 붙인 뒤 이것에 따라서 컬럼을 정렬하는 연습을 해 본다. 컬럼의 위치만 바뀔 뿐 각 컬럼 내의 값은 원래의 행 번호를 그대로 지킨다.
> z =  matrix(c(4:1,12:9,5:8),4,3)
> z
     [,1] [,2] [,3]
[1,]    4   12    5
[2,]    3   11    6
[3,]    2   10    7
[4,]    1    9    8
> colnames(z) = c("A","C","B")
> z
     A  C B
[1,] 4 12 5
[2,] 3 11 6
[3,] 2 10 7
[4,] 1  9 8
> z[, order(colnames(z))]
     A B  C
[1,] 4 5 12
[2,] 3 6 11
[3,] 2 7 10
[4,] 1 8  9
apply()와 join() 계열의 함수를 잘 써야 하는데... 아직도 멀었다!

댓글 없음: