이번에는 1부터 10까지의 숫자를 홀수별, 짝수별로 묶어서 합을 구해보자. INDEX에 홀수와 짝수별로 다른 팩터 값이 주어지도록 %% 24를 사용했다.
> tapply(1:10, 1:10 %% 2 == 1, sum)
FALSE TRUE
30 25
수행 결과 짝수의 합이 30(=2+4+6+8+10), 홀수의 합이 25(=1+3+5+7+9)로 구해졌다. 아이리스 데이터에서 Species별 Sepal.Length의 평균을 구해보자.
> tapply(iris$Sepal.Length, iris$Species, mean)
setosa versicolor virginica
5.006 5.936 6.588
이번에는 조금 더 복잡한 그룹화를 다뤄보자. 계절별 성별로 정리된 판매량 데이터가 다음과 같이 주어졌다고 하자.
> m <- matrix(1:8, + ncol=2, + dimnames=list(c("spring", "summer", "fall", "winter"), + c("male", "female"))) > m male female spring 1 5 summer 2 6 fall 3 7 winter 4 8
행렬의 행은 봄, 여름, 가을, 겨울을 뜻하고 열은 성별을 의미한다. 이때 반기별, 성별 셀의 합을 구해보자. 즉, 상반기(봄, 여름)의 남성 셀 합(=1+2)과 여성 셀 합(=5+6), 하반기(가을, 겨울)의 남성 셀 합(=3+4)과 여성 셀 합(=7+8)을 구하는 것이 목표다.
이 연산을 수행하기 위한 성별, 분기별 그룹은 다음과 같이 구성할 수 있다. 그림에서 (n, m) 값은 tapply( )에 INDEX로 주어질 값들을 의미한다.
male |
female |
|||
spring |
(1, 1) |
1 |
(1, 2) |
5 |
summer |
(1, 1) |
2 |
(1, 2) |
6 |
fall |
(2, 1) |
3 |
(2, 2) |
7 |
winter |
(2, 1) |
4 |
(2, 2) |
8 |
INDEX를 실제로 지정할 때는 (n, m)에서 n을 먼저 나열한 뒤 m 값을 나열한다. 즉, 그룹 (n1, m1), (n2, m2)는 list(c(n1, n2), c(m1, m2))로 표현한다. 다음은 이러한 방식으로 tapply( )를 사용한 분기별, 성별 합을 구한 예다.
> tapply(m, list(c(1, 1, 2, 2, 1, 1, 2, 2), + c(1, 1, 1, 1, 2, 2, 2, 2)), sum) 1 2 1 3 11 2 7 15
tapply( )는 클러스터링 알고리즘을 수행한 후 같은 클러스터에 속한 데이터들의 x 좌표의 평균, y 좌표의 평균을 계산하는 데 사용할 수 있는데, 바로 이때 위와 같은 방식으로 색인을 부여한다. 따라서 조금 복잡해 보여도 여기서 배운 내용을 꼭 알고 넘어가도록 하자.
4 %%는 나머지를 구하는 연산자다. 몫은 %/%로 구할 수 있다.