이번에는 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 %%는 나머지를 구하는 연산자다. 몫은 %/%로 구할 수 있다.

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