더북(TheBook)

<데이터 분석을 위한 분할-적용-병합 전략>[3]에 실린 미국 프로야구 선수 데이터가 저장된 baseball 데이터를 활용한 예를 살펴보자. 다음에 데이터의 일부를 보였다.

> head(baseball)
           id year stint team lg g  ab  r  h X2b X3b hr rbi sb cs bb so ibb hbp sh sf gidp
4   ansonca01 1871     1  RC1   25 120 29 39  11   3  0  16  6  2  2  1  NA  NA NA NA   NA
44  forceda01 1871     1  WS3   32 162 45 45   9   4  0  29  8  0  4  0  NA  NA NA NA   NA
68  mathebo01 1871     1  FW1   19  89 15 24   3   1  0  10  2  1  2  0  NA  NA NA NA   NA
99  startjo01 1871     1  NY2   33 161 35 58   5   1  1  34  4  2  3  0  NA  NA NA NA   NA
102 suttoez01 1871     1  CL1   29 128 35 45   3   7  3  23  3  1  1  0  NA  NA NA NA   NA
106 whitede01 1871     1  CL1   29 146 40 47   6   5  1  21  2  2  4  1  NA  NA NA NA   NA

데이터의 각 행에는 선수id가 해당 연도year에 기록한 성적이 들어 있다. 각 컬럼의 자세한 의미는 help(baseball) 명령으로 알아보기 바란다.

다음은 선수 ansonca01의 기록을 살펴본 예다. id에 ansonca01가 저장되어 있고 year 컬럼을 보면 1871, 1872, …, 1876년까지의 성적이 저장되어 있음을 알 수 있다.

> head(subset(baseball, id=="ansonca01"))
           id year stint team lg  g  ab  r   h X2b X3b hr rbi sb cs bb so ibb hbp sh sf gidp
4   ansonca01 1871     1  RC1    25 120 29  39  11   3  0  16  6  2  2  1  NA  NA NA NA   NA
121 ansonca01 1872     1  PH1    46 217 60  90  10   7  0  50  6  6 16  3  NA  NA NA NA   NA
276 ansonca01 1873     1  PH1    52 254 53 101   9   2  0  36  0  2  5  1  NA  NA NA NA   NA
398 ansonca01 1874     1  PH1    55 259 51  87   8   3  0  37  6  0  4  1  NA  NA NA NA   NA
525 ansonca01 1875     1  PH1    69 326 84 106  15   3  0  58 11  6  4  2  NA  NA NA NA   NA
741 ansonca01 1876     1  CHN NL 66 309 63 110   9   7  2  59 NA NA 12  8  NA  NA NA NA   NA

baseball 데이터에 ddply( )를 사용해 각 선수가 출전한 게임 수(컬럼명 ‘g’)의 평균을 구해보자. 각 선수별로 데이터를 그룹 짓기 위해 .(id)를 사용하고, 분할된 각 그룹마다 g의 평균을 계산하면 선수마다의 평균 게임 수가 된다.

> ddply(baseball, .(id), function(sub) { mean(sub$g) })
           id        V1
1   aaronha01 143.39130
2   abernte02  40.05882
3   adairje01  77.66667
4   adamsba01  25.36842
5   adamsbo03  85.40000
6   adcocjo01 115.23529
7   agostju01  36.20000
8   aguilri01  38.42105
9   aguirha01  27.93750
10  ainsmed01  63.41176
...
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.