더북(TheBook)

이번에는 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로 주어질 값들을 의미한다.

표 4-13 성별, 분기별 그룹을 위한 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 %%는 나머지를 구하는 연산자다. 몫은 %/%로 구할 수 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.