티스토리 뷰

반응형

요약


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



2. sort() 함수


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

> orderBy( ~ DEPTNO + SAL, emp)   # orderBy() 함수는 여러 컬럼 기준으로 정렬할 경우 +(플러스)로 나열 
   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



반응형
댓글
최근에 올라온 글
최근에 달린 댓글
링크
Total
Today
Yesterday