[R] 데이터 정렬 — <sort, order>

HSLee
4 min readMar 26, 2019

--

데이터를 정렬하는 함수인 sort()와 order() 함수를 알아보자.

sort()는 주어진 데이터를 직접 정렬해주는 함수이며 order()는 데이터를 정렬했을 때의 순서를 반환한다.

1. sort()

sort()는 주어진 벡터를 정렬한 결과를 반환한다. ‘defreasing=TRUE or FALSE’ 를 이용하면 데이터를 각각 내림차순, 오름차순 정렬을 할 수 있다. 입력하지 않으면 기본값인 오름차순으로 정렬된다. 또한 ‘na.last’를 이용하면 NA값의 위치를 정할 수 있다. TRUE라면 정렬한 결과의 마지막, FALSE라면 맨 처음에 둔다. 입력하지 않으면 기본값인 ‘na.last=NA’ 가 적용되며 이는 NA값을 정렬 결과에서 제외한다.

> x <- c(20,11,33,50,47)
> sort(x)
[1] 11 20 33 47 50
> sort(x,decreasing = TRUE)
[1] 50 47 33 20 11
> x
[1] 20 11 33 50 47
> y <- c(20,11,33,50,47,NA)
> sort(y)
[1] 11 20 33 47 50
> sort(y,na.last = TRUE)
[1] 11 20 33 47 50 NA

위 코드에서 알 수 있듯이, sort()는 값을 정렬한 결과를 반환할 뿐, 인자로 받은 벡터 자체를 변경하지는 않는다.

2. order()

order()는 주어진 인자를 정렬하기 위한 각 요소의 인덱스를 반환한다. 다음은 임의의 값을 저장한 벡터 x를 정렬하기 위한 순서를 반환한 예다. order(x)는 x[order(x)]가 정렬되어 있게 하기 위한 인덱스이다.

> x <- c(20,11,33,50,47)
> order(x)
[1] 2 1 3 5 4
> order(x,decreasing = TRUE)
[1] 4 5 3 1 2

order()가 정렬된 순서를 반환한다는 점을 이용하여 데이터 프레임을 정렬할 수 있다. 다음은 아이리스 데이터를 Sepal.Length에 따라 정렬한 예시다.

> iris[order(iris$Sepal.Length),]
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
14 4.3 3.0 1.1 0.1 setosa
9 4.4 2.9 1.4 0.2 setosa
39 4.4 3.0 1.3 0.2 setosa
43 4.4 3.2 1.3 0.2 setosa
42 4.5 2.3 1.3 0.3 setosa
4 4.6 3.1 1.5 0.2 setosa
7 4.6 3.4 1.4 0.3 setosa
23 4.6 3.6 1.0 0.2 setosa
48 4.6 3.2 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
30 4.7 3.2 1.6 0.2 setosa
12 4.8 3.4 1.6 0.2 setosa
...

결과를 보면 9행, 39행, 43행의 Sepal.Length가 모두 같다. 이와 같이 Sepal.Length가 같을 경우 Petal.Length의 순서에 따라 정렬하려면 Petal.Length를 추가적인 인자로 order()에 넘기면 된다.

> iris[order(iris$Sepal.Length, iris$Petal.Length),]
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
14 4.3 3.0 1.1 0.1 setosa
39 4.4 3.0 1.3 0.2 setosa
43 4.4 3.2 1.3 0.2 setosa
9 4.4 2.9 1.4 0.2 setosa
42 4.5 2.3 1.3 0.3 setosa
23 4.6 3.6 1.0 0.2 setosa
7 4.6 3.4 1.4 0.3 setosa
48 4.6 3.2 1.4 0.2 setosa
...

보다시피 9, 39, 43이었던 순서가Petal.Length의 크기에 따라 39,43,9행 순서로 바뀐걸 확인할 수 있다.

출처 : R을 이용한 데이터 처리 & 분석 (저자 : 서민구)

--

--

HSLee
HSLee

Written by HSLee

Data Scientist를 꿈꾸는 MathScientist

No responses yet