R: 자료를 부분으로 나누어 처리하기

subset - 원하는 부분만 골라내기

> 신체검사
  이름 성별  키 몸무게
1 철수   남 180     80
2 영수   남 170     77
3 민수   남 160     65
4 영희   여 170     57
5 진희   여 160     50
6 민희   여 150     44

만약 키가 160이상인 사람들의 자료만 보려고 한다면 다음과 같이 subset 함수를 사용할 수 있다.

> subset(신체검사,키 > 160)
  이름 성별  키 몸무게
1 철수   남 180     80
2 영수   남 170     77
4 영희   여 170     57

물론 []를 사용하여 다음과 같이 표현할 수도 있다.

> 신체검사[신체검사$키>160,]

이름과 성별은 빼고 키와 몸무게만 알고 싶다면 다음과 같이 할 수 있다.

> 신체검사.수치 = subset(신체검사,select=c(키,몸무게))
> 신체검사.수치
   키 몸무게
1 180     80
2 170     77
3 160     65
4 170     57
5 160     50
6 150     44

역시 []를 사용할 수도 있다.

> 신체검사[c(3,4)]

두 가지를 모두 사용하는 것도 가능하다. 즉 조건에 맞는 행의 원하는 열만 보는 것이다.

> subset(신체검사, 키 > 160, select=c(키,몸무게))
   키 몸무게
1 180     80
2 170     77
4 170     57

aggregate - 자료를 요약하기

> 성적
   이름 과목 학기 점수
1  철수 국어    1   80
2  철수 영어    1   70
3  철수 수학    1   65
4  영희 국어    1   90
5  영희 영어    1   80
6  영희 수학    1   70
7  철수 국어    2   90
8  철수 영어    2   50
9  철수 수학    2   80
10 영희 국어    2   60
11 영희 영어    2   50
12 영희 수학    2   85

전체 평균을 구하고 싶다면 단순히 mean 함수를 사용하면 된다.

> mean(성적$점수)
[1] 72.5

만약 전체 평균이 아니라 각 부분의 평균을 구하고 싶다면 어떻게 할까? 이럴 때 aggregate 함수를 사용한다.

학생별 평균을 구하는 경우

> aggregate(성적$점수, list(이름=성적$이름), mean)
  이름    x
1 영희 72.5
2 철수 72.5

학생들의 학기별 평균을 구하는 경우

> aggregate(성적$점수, list(이름=성적$이름, 학기=성적$학기), mean)
  이름 학기        x
1 영희    1 80.00000
2 철수    1 71.66667
3 영희    2 65.00000
4 철수    2 73.33333

aggregate 함수의 기본 사용법은 다음과 같다.

aggregate( 계산할 값, 자료를 여러 부분으로 나누는 기준, 계산할 함수)

자료를 부분으로 나눌 때 위에서처럼 이름 따위를 직접 사용할 수도 있지만 어떤 조건을 걸 수도 있다. 예를 들어 학생들마다 85점 이상 점수를 맞은 과목의 수를 알고 싶다고 하자.

> aggregate(성적$점수, list(이름=성적$이름, 성적우수= 성적$성적 > 85 ), length)
  이름 성적우수 x
1 영희    FALSE 5
2 철수    FALSE 4
3 영희     TRUE 1
4 철수     TRUE 2

aggregate에서 계산할 값에 벡터가 아니라 데이터프레임이 오면 모든 열에 대하여 함수를 적용한다. "신체검사.수치"는 앞의 절에서 만든 데이터프레임으로 키와 몸무게를 담고 있다.

> aggregate(신체검사.수치, list(성별=신체검사$성별), mean)
  성별  키   몸무게
1   남 170 74.00000
2   여 160 50.33333