본문 바로가기

R

[R을 이용한 데이터 처리&분석 실무] 5장 내용 정리_Part 1

이번 포스팅에서는 "데이터 조작 II : 데이터 처리 및 가공"에 대해서 정리해보겠다.

 

자, 그럼 시작해보겠다!!

 

▶ SQL을 사용한 데이터 처리

- sqldf(x)

  • x : SQL SELECT 문
  • 데이터 프레임에 SQL SELECT 질의를 수행한다. (그냥 SQL과 똑같다고 생각하고 사용하면 된다)
  • 반환 값데이터 프레임이다.

※ iris 데이터를 예시로 설명하면, R과 달리 SQL에서 '.'은 테이블 컬럼명이 될 수 없으므로, Sepal.Length가 아니라 Sepal_Length로 컬럼명을 적어야 한다. 또한 SQL에서 대소문자 구별은 없으므로 Sepal_Length 대신 sepal_length로 적어도 된다.

 

 

▶ 분할, 적용, 재조합을 통한 데이터 분석

<plyr 패키지>

  • 데이터를 분할하고(split), 분할된 데이터에 특정 함수를 적용한 뒤(apply), 그 결과를 재조합(combine)하는 세 단계로 데이터를 처리하는 함수들을 제공한다.
    • 데이터의 분할, 계산, 조합을 한 번에 처리해주어 여러 함수로 처리해야 할 일을 짧은 코드로 대신해준다.
  • plyr의 입력은 배열, 데이터 프레임, 리스트가 될 수 있다.
  • plyr의 출력도 배열, 데이터 프레임, 리스트가 될 수 있으며 아무런 결과도 출력하지 않을 수도 있다.

{adl}                    {adl_}                 ply

입력 데이터 타입   출력 데이터 타입                     

문자 용도 의미
a 입력, 출력 배열
d 입력, 출력 데이터 프레임
l 입력, 출력 리스트
_ 출력 아무런 출력도 없음

 

1. adply(.data, .margins, .fun = NULL)

  • .data : 행렬, 배열, 또는 데이터 프레임
  • .margins : 함수를 적용할 방향으로, 1 (행 방향), 2 (컬럼 방향) 또는 c(1, 2) (행과 컬럼 모두의 방향)을 지정할 수 있다.
  • .fun = NULL : .margins 방향으로 잘려진 데이터에 적용할 함수
  • 배열을 분할하고 함수를 적용한 뒤, 결과를 데이터 프레임으로 반환한다.
  • adply( )와 유사한 함수인 apply( )는 행 방향으로 처리할 때, 각 컬럼에 서로 다른 데이터 타입이 섞여 있다면 예상치 못한 타입 변환이 발생할 수 있다.
  • 반면, adply( )를 사용하면 위와 같은 예상치 못한 타입 변환을 피할 수 있다.

 

  • 위의 R 코드는 데이터 프레임의 각 행을 보면서 Sepal.Length가 5.0 이상이고, Species가 'setosa' 인지 여부를 확인한 다음, 그 결과를 새로운 컬럼 sepal_ge_5_setosa에 기록하는 예다.
  • 최종 반환 값이 데이터 프레임인 경우, 위처럼 함수의 반환 값을 데이터 프레임으로 하는 것이 안전하다.
  • 또한 데이터 프레임을 반환할 경우, 위와 같이 계산 값을 저장한 칼럼명을 적절히 지정할 수 있다.

 

2. ddply(.data, .variables, .fun = NULL)

  • .data : 행렬, 배열 또는 데이터 프레임
  • .variables : 데이터를 그룹 지을 변수명
  • .fun = NULL : 데이터에 적용할 함수
  • 데이터 프레임을 분할하고 함수를 적용한 뒤, 결과를 데이터 프레임으로 반환한다.
  • adply( )행 또는 컬럼 단위로 함수를 적용하는 반면, ddply( ).variables에 나열한 컬럼에 따라 데이터를 나눈 뒤 함수를 적용한다.

  • 위의 첫 번째 R 코드는 Species와 Sepa.Length가 5.0 보다 큰지 여부 두 가지 조건으로 데이터를 그룹 지은 뒤, 각 그룹마다 Sepal.Width의 평균을 계산한 예다.
  • 두 번째, 세 번째 R 코드는 baseball 데이터를 활용하여, 각 선수 별로 데이터를 그룹 짓기 위해 .(id)를 사용하고, 분할된 각 그룹마다 g의 평균을 계산한 예다.
    • 즉, 선수마다의 평균 게임 수를 계산한 것이다.

 

 

▶ 그룹마다 연산을 쉽게 수행하기

◎ transform(_data, . . .)

  • _data : 변환할 객체
  • . . . : 태그 = 값 형태의 인자들
  • 데이터 프레임 _data에 . . . 에 지정한 연산을 수행한 뒤, 그 결과를 저장한 새로운 컬럼을 추가한 데이터 프레임반환한다.

  • 위 R 코드는 데이터를 선수 id로 분할하여 그룹 지은 뒤, 각 그룹에서 year의 최솟값과 현재 행의 year 값의 차이를 cyear에 저장한 예다.

 

 mutate(.data, . . .)

  • .data : 변환할 데이터 프레임
  • . . . : 새로운 컬럼 정의. 컬럼명 = 값 형식
  • 반환 값변환된 결과다.
  • 컬럼명 = 값 형태로 지정된 연산이 여러 개 있을 때, 앞서의 연산 결과를 뒤에 나오는 연산에서 참조할 수 있다.

 

 summarise(.data, . . .)

  • .data : 요약할 데이터 프레임
  • . . . : 변수 = 값 형태의 인자들
  • 데이터의 요약 정보를 만드는 데 사용하는 함수이다.
  • . . . 에 지정된 그룹마다의 요약을 수행한 뒤, 그 결과를 저장한 새로운 컬럼이 추가된 데이터 프레임을 반환한다.

  • 만약 여러 요약 값을 구하고 싶다면, 위의 R 코드처럼 요약 값 계산을 계속 나열하면 된다.

 

 subset(x, subset) 또는 subset(x, subset, select)

  • x : 일부를 취할 데이터
  • subset : 데이터를 선택할지 여부를 지정한 논리값 벡터
  • select : 선택할 컬럼의 벡터. 제외할 컬럼은 '-'를 붙여서 표시
  • 벡터, 행렬, 데이터 프레임의 일부를 반환한다.
    • 즉, 각 분할별로 데이터를 추출하는 데 사용한다.
  • 아래의 R 코드와 같이 조건을 지정하면, 그룹별로 조건을 만족하는 행만 추출할 수도 있다.

 

 

3. mdply(.data, .fun)

  • .data : 인자로 사용할 행렬 또는 데이터 프레임
  • .fun : 호출할 함수
  • 배열이나 데이터 프레임에 저장된 인자로 함수를 호출하고, 결과를 데이터 프레임으로 반환한다.

  • 위의 R 코드는 mdply( )를 사용하여 데이터 프레임의 각 행을 rnorm( ) 함수의 mean, sd에 대한 인자로 넘겨 주어 실행한 뒤, 그 결과를 데이터 프레임으로 모은 예다.

 

여기까지 해서 5장 <Part 1> 포스팅을 마치도록 하겠다.

 

 

★ 참고 자료

- R을 이용한 데이터 처리&분석 실무 교재