더북(TheBook)

좀 더 재미있는 통계는 length보다는 sum, mean 또는 임의의 함수를 적용해 구할 수 있다. 다음 데이터는 time에 따라 평균값이 어떻게 달라지는지를 보여준다.

> dcast(m, time ~ variable, mean, na.rm=TRUE)
  time   potato  buttery    grassy   rancid   painty
1    1 8.562500 2.236111 0.9416667 2.358333 1.645833
2    2 8.059722 2.722222 1.1819444 2.845833 1.444444
3    3 7.797222 2.102778 0.7500000 3.715278 1.311111
4    4 7.713889 1.801389 0.7416667 3.602778 1.372222
5    5 7.328169 1.642254 0.6352113 3.529577 2.015493
6    6 6.670833 1.752778 0.6736111 4.075000 2.341667
7    7 6.168056 1.369014 0.4208333 3.886111 2.683333
8    8 5.431944 1.182857 0.3805556 4.272222 3.938028
9    9 5.673333 1.586667 0.2766667 4.670000 3.873333
10  10 5.703333 1.765000 0.5566667 6.068333 5.291667

dcast( ) 호출 시 포뮬러에서 ~ 우측은 측정 변수를 적는 곳으로, 이곳에 적은 변수는 결과에서 새로운 컬럼이 된다. 따라서 식별자를 ~ 오른쪽에 적으면 해당 식별자 값마다 variable의 요약치를 새로운 컬럼으로 한 결과를 얻을 수 있다. 다음은 각 time마다 (treatment, variable) 순서쌍에 해당하는 value의 평균을 계산한 예다.

> dcast(m, time ~ treatment + variable, mean, na.rm=TRUE)
  time 1_potato 1_buttery  1_grassy 1_rancid  1_painty 2_potato 2_buttery
1    1 7.925000 1.7958333 0.9041667 2.758333 2.1500000 8.775000  2.491667
2    2 7.591667 2.5250000 1.0041667 3.900000 1.9750000 8.537500  3.125000
3    3 7.770833 2.2958333 0.8166667 4.650000 1.1166667 7.637500  2.079167
4    4 8.404167 1.9791667 1.0250000 2.079167 0.4666667 8.204167  1.608333
5    5 7.741667 1.3666667 0.7708333 4.279167 3.0083333 6.933333  1.858333
6    6 6.079167 1.8250000 0.4666667 4.337500 2.5541667 7.016667  2.054167
7    7 6.283333 1.2416667 0.1625000 3.204167 2.1958333 5.729167  1.356522
8    8 5.175000 0.9869565 0.6333333 5.387500 4.5875000 5.641667  1.582609
9    9 6.070000 1.8300000 0.1350000 3.950000 2.9050000 5.470000  1.665000
10  10 5.465000 1.9600000 0.4550000 6.495000 5.4000000 5.580000  1.795000

    2_grassy 2_rancid  2_painty 3_potato 3_buttery  3_grassy 3_rancid 3_painty
1  0.9958333 1.716667 0.8083333 8.987500  2.420833 0.9250000 2.600000 1.979167
2  0.9500000 2.141667 0.6625000 8.050000  2.516667 1.5916667 2.495833 1.695833
3  0.7250000 2.895833 1.5625000 7.983333  1.933333 0.7083333 3.600000 1.254167
4  0.6416667 3.512500 1.8583333 6.533333  1.816667 0.5583333 5.216667 1.791667
5  0.5833333 3.641667 0.7375000 7.308696  1.704348 0.5478261 2.630435 2.313043
6  0.9208333 3.841667 2.7500000 6.916667  1.379167 0.6333333 4.045833 1.720833
7  0.5500000 3.837500 3.0416667 6.491667  1.508333 0.5500000 4.616667 2.812500
8  0.3958333 3.825000 3.8652174 5.479167  0.987500 0.1125000 3.604167 3.358333
9  0.0800000 5.240000 4.0450000 5.480000  1.265000 0.6150000 4.820000 4.670000
10 0.6950000 6.310000 6.1700000 6.065000  1.540000 0.5200000 5.400000 4.305000

위 결과에서 1_potato는 treatment가 1일 때 potato 값을, 2_potato는 treatment가 2일 때 potato 값을 의미한다. 다른 컬럼들도 같은 방식으로 이해할 수 있다.

비교를 위해 같은 연산을 ddply( )를 사용해 계산해보자. 이처럼 같은 연산을 서로 다른 함수나 패키지로 해보는 것도 R 프로그래밍 실력을 높이는 데 많은 도움이 된다.

> ddply(m, .(time, treatment, variable), function(rows) {
+ return(mean(rows$value, na.rm=TRUE))
+ })
  time treatment variable        V1
1    1         1   potato 7.9250000
2    1         1  buttery 1.7958333
3    1         1   grassy 0.9041667
4    1         1   rancid 2.7583333
5    1         1   painty 2.1500000
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.