본문 바로가기

배우기/복습노트[R과 분석]

[복습] R(programming language)에서의 정렬(order, sort, orderBy, arrange)

728x90
반응형

정렬의 개념 중 1차 정렬, 2차 정렬의 개념을 명확히 알아야 한다.

특히 2차 정렬은, 1차 정렬 결과에서 같은 값을 가질 경우 그 데이터를 추가 정렬을 수행하는 것이다.

 

예를 들면,

위와 같이 성별 정렬 후 이름을 정렬하게 되면 우측 결과처럼 출력이 된다.

 

성별 이름별 정렬을 하라고 한다면 언어적 느낌상 group by 후 sort를 하라는 것 같지만 그렇게 착각하여서는 안된다. 성별을 1차로 정렬하고 이름을 2차로 정렬하라는 의미이다.

 

 

정렬 함수는 여러 개가 있는데 쓰임의 빈도에 맞게 ★를 달아보자.

1.order ★ ★ ★

  - 직접 정렬된 결과로 리턴해주지 못한다

  - 정렬된 순서대로 위치 값을 리턴한다 → 위치를 색인으로 전달하여 원하는 순서를 보장한다.

 

문법은 다음과 같다.

order(....,                              # 가변형 인수 전달 방식(정렬 대상은 벡터, 여러 개 전달이 가능하다)

          na.last = TRUE,         # NA를 마지막에 배치할지의 여부

          method = c("auto",     # 정렬방식

                             "shell", 

                            "radix"))

 

예) 벡터의 정렬

위치로 리턴하게 된다. 직접 정렬을 하지 못한다.

가장 작은 값이 1번 위치에 있는 값, 두 번째 작은 값이 3번 위치에 있는 값... 이렇게 해석된다.

제대로 정렬된 값을 출력하기 위해서는 v1[order(v1)] 하면 된다.

 

 

예) emp에서 SAL이 작은 순서대로 정렬하여라

emp에서는 SAL 만으로는 배치를 바꿀 수 없기 때문에 order가 필요하다.

 

이렇게 SAL로 정렬되어 출력된다.

sql은 내부의 로직이 감추어져 있는데 R은 내부 로직이 그대로 드러난다. 그래서 R이 더 직관적이다.

 

 

예) emp에서 부서별(10, 20, 30 순서)로 SAL이 작은 순서대로 정렬하여라.

 

여기서 문제를 착각하여 ddply(emp, .(DEPTNO), summarise, v1=order(SAL)) 이렇게 하면 안된다.

이렇게 출력되기는 하나 SAL의 위치값만 출력이 되고 직접 정렬된 결과를 리턴해주지 못한다.

 

 

예) emp에서 부서별(10, 20, 30 순서)로 SAL이 큰 순서대로 정렬하여라.

 

decreasing 옵션을 사용하고, 위처럼 각 컬럼 별 옵션을 다르게 줄 수 있다.

 

 

연습문제를 한 문제 풀어보자.

student.csv 파일을 읽고 성별(숫자) 키가 큰 순서대로 정렬하여라

g1: 숫자컬럼(1,2)

g2: 문자컬럼(남, 여)

 

Line 3은 성별을 숫자로 구분한 것으로 오류가 발생하지 않는다.

Line 4은 성별을 문자로 구분한 것으로 오류가 발생하였다. 오류 메시지를 읽고 Line 5로 옵션을 넣으니 제대로 출력이 되었다.

R의 order 함수에서는 숫자벡터와 문자벡터의 서로 다른 순서 정렬이 일반적으로 불가능하다.

즉 HEIGHT는 숫자이고 성별은 문자이기 때문이다.

 

 

 

2. sort

 - 정렬된 결과를 리턴한다(위치 리턴 아님)

이렇게 정렬된 결과를 리턴한다.

문법은 다음과 같다.

sort(x,                  # 벡터(여러 대상이 올 수 없음. 대상의 순서 자체를 바꿔 리턴하므로, 단 하나의 객체만 전달이 가능함)

       decreasing = F, 

        ...)

 

sort(emp$SAL) 이 벡터에 대해서는 정렬이 가능하지만 원본까지의 수정은 불가능하다.

즉 SAL 자체의 정렬 순서는 리턴되나 데이터 프레임 순서는 보장이 불가하다.

 

 

728x90

 

 

 

3. doBy::orderBy ★ 

분석기사 시험에 포함된 함수는 아니므로 넘어간다.

 

 

4. plyr::arrange ★★ 

  - 데이터 프레임 입력이 가능하며 데이터 프레임으로 출력된다.

문법은 다음과 같다.

plyr::arrange(df,          #대상, 데이터 프레임

                       ....)        # 정렬 대상

 

아래의 여러 테스트 결과로 익히면 되겠다.

 

문법에는 내림차순에 대한 옵션이 없으므로 내림차순을 할 객체에 desc()를 씌워주면 된다(Line 8).

 

아까 위에서 g1, g2로 성별 나눈 문제에서 order 함수는 숫자 컬럼과 문자 컬럼의 서로 다른 타입의 경우 추가 옵션이 필요했으나 여기서는 서로 다른 타입에 대하여 추가 옵션 필요 없디 서로 다른 정렬 순서를 보장해준다.

 

 

연습문제를 풀어보자.

professor.csv 파일을 읽고 직급별 입사연도가 빠른 순서대로 정렬하여 출력하여라.

 

728x90
반응형