티스토리 뷰
요약
order() : 정렬된 쉘의 위치 값 리턴, 색인으로 데이터 정렬 / 전체 데이터 정렬 가능
sort() : 정렬된 데이터 바로 리턴 / 전체 데이터 정렬 불가능
orderBy() : 정렬된 데이터 바로 리턴 / 전체 데이터 정렬 가능
데이터 정렬
R에서 데이터를 정렬하는 함수는 order(), sort)(), doBy::orderby() 함수가 있습니다.
주로 order(), sort() 함수가 많이 사용됩니다.
# 데이터 준비
> v1 <- c(1,10,2,5,3)
> v2 <- c(1,10,2,NA,5,3)
1. order() 함수
order(데이터, na.last, decreasing) : 정렬된 쉘의 위치 값 리턴(리턴된 값을 색인하면 정렬된 값 출력 가능)
order() 함수는 default로 NA값을 정렬 결과에서 제외합니다. 그리고 오름차순을 기본 정렬 순서로 합니다.
> order(v1) # 2번째 값이 가장 큰 것을 확인
[1] 1 3 5 4 2
> v1[order(v1)] # 색인을 통해 정렬된 값 출력
[1] 1 2 3 5 10
> v2[order(v2)] # NA를 맨 끝으로 배치(default)
[1] 1 2 3 5 10 NA
> v2[order(v2, na.last = F)] # NA를 처음으로 배치
[1] NA 1 2 3 5 10
> v1[order(v1, decreasing = T)] # 내림차순 정렬
[1] 10 5 3 2 1
sort() : 정렬된 데이터 바로 리턴(순서에 맞게 재배치 후 값 출력)
> sort(v1) # 정렬된 데이터를 바로 출력
[1] 1 2 3 5 10
> sort(v1, decreasing = T) # 내림차순 정렬
[1] 10 5 3 2 1
> sort(v2) # NA 무시(default)
[1] 1 2 3 5 10
# Q. emp에서 SAL이 큰 순서대로 데이터 정렬
> emp <- read.csv("emp.csv", stringsAsFactors = F)
> order(emp$SAL, decreasing = T) # 9번째 행이 가장 큰 것을 확인
[1] 9 8 13 4 6 7 2 10 14 3 5 11 12 1
> emp[order(emp$SAL, decreasing = T),] # 색인을 통한 정렬(order() 함수로 전체 데이터 정렬 가능)
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
9 7839 KING PRESIDENT NA 1981-11-17 0:00 5000 NA 10
8 7788 SCOTT ANALYST 7566 1987-04-17 0:00 3000 NA 20
...
12 7900 JAMES CLERK 7698 1981-12-03 0:00 950 NA 30
1 7369 SMITH CLERK 7902 1980-12-17 0:00 800 NA 20
> sort(emp$SAL, decreasing = T) # sort()함수로는 전체 데이터 정렬 불가능
[1] 5000 3000 3000 2975 2850 2450 1600 1500 1300 1250 1250 1100 950 800
3. orderBy() 함수
orderBy(formula = 나열컬럼 ~ 정렬컬럼, data = 원본) : 정렬된 데이터 바로 리턴
orderBy() 함수도 order() 함수와 마찬가지로, default로 NA값을 정렬 결과에서 제외하고 오름차순을 기본 정렬 순서로 합니다.
장점: 색인을 거치지 않고 데이터가 정렬
단점: 정렬 순서를 뒤바꾸는 decreasing 옵션이 없음(내림차순 정렬 불가)
> library(doBy)
# 주의사항. formula에는 반드시 컬럼명만 나열해야 하고, formula에 정의되어있는 컬럼은 단독으로 사용해야합니다.
> orderBy( ~ SAL, emp)
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
1 7369 SMITH CLERK 7902 1980-12-17 0:00 800 NA 20
12 7900 JAMES CLERK 7698 1981-12-03 0:00 950 NA 30
11 7876 ADAMS CLERK 7788 1987-05-23 0:00 1100 NA 20
...
8 7788 SCOTT ANALYST 7566 1987-04-17 0:00 3000 NA 20
13 7902 FORD ANALYST 7566 1981-12-03 0:00 3000 NA 20
9 7839 KING PRESIDENT NA 1981-11-17 0:00 5000 NA 10
# Q. emp에서 DEPTNO순으로 정렬, DEPTNO가 같을 경우 SAL 순으로 정렬
> emp[order(emp$DEPTNO, emp$SAL),] # 여러 컬럼을 기준으로 정렬할 경우 ,(콤마)로 나열
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
14 7934 MILLER CLERK 7782 1982-01-23 0:00 1300 NA 10
7 7782 CLARK MANAGER 7839 1981-06-09 0:00 2450 NA 10
9 7839 KING PRESIDENT NA 1981-11-17 0:00 5000 NA 10
...
10 7844 TURNER SALESMAN 7698 1981-09-08 0:00 1500 0 30
2 7499 ALLEN SALESMAN 7698 1981-02-20 0:00 1600 300 30
6 7698 BLAKE MANAGER 7839 1981-05-01 0:00 2850 NA 30
> emp[order(emp$DEPTNO, emp$SAL, decreasing = T),]
# order()함수는 여러 컬럼 기준 정렬 시, 각 컬럼별 (하나는 오름, 다른 하나는 내림차순)정렬이 불가,
묶음 정렬만 가능합니다.(오른차순 정렬 시 다 오름차순, 내림차순 정렬 시 다 내림차순)
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
6 7698 BLAKE MANAGER 7839 1981-05-01 0:00 2850 NA 30
2 7499 ALLEN SALESMAN 7698 1981-02-20 0:00 1600 300 30
10 7844 TURNER SALESMAN 7698 1981-09-08 0:00 1500 0 30
...
9 7839 KING PRESIDENT NA 1981-11-17 0:00 5000 NA 10
7 7782 CLARK MANAGER 7839 1981-06-09 0:00 2450 NA 10
14 7934 MILLER CLERK 7782 1982-01-23 0:00 1300 NA 10
'R > Process' 카테고리의 다른 글
[R] 데이터 병합(merge) - Join, Outer Join, Self Join (0) | 2019.01.07 |
---|---|
[R] 데이터 구조 변경 - stack, unstack (0) | 2019.01.07 |
[R] 데이터 요약 통계, 분위수 확인 - summary(), quantile(), summartBy() (0) | 2019.01.07 |
[R] apply 계열 함수 - 적용 함수(원소별 연산, 그룹별 연산) (0) | 2019.01.07 |
[R] 데이터 포맷 변경 함수 - sprintf(), gettextf() 함수 (0) | 2019.01.04 |