2011-01-29 4 views
6

데이터 세트 mtcars (기본 R 버전 2.12.1의 일부)에 대한 요약 통계를 원한다고 가정합니다. 아래에, 나는 엔진 실린더 수에 따라 자동차를 그룹화하고 나머지 변수의 그룹 단위 평균값을 mtcars으로 취합니다.그룹화 변수가 요인 일 경우 어떻게 그룹 별 요약 통계를 생성합니까?

> str(mtcars) 
'data.frame': 32 obs. of 11 variables: 
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ... 
$ cyl : num 6 6 4 6 8 6 8 4 4 6 ... 
$ disp: num 160 160 108 258 360 ... 
$ hp : num 110 110 93 110 175 105 245 62 95 123 ... 
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ... 
$ wt : num 2.62 2.88 2.32 3.21 3.44 ... 
$ qsec: num 16.5 17 18.6 19.4 17 ... 
$ vs : num 0 0 1 1 0 1 0 1 1 1 ... 
$ am : num 1 1 1 0 0 0 0 0 0 0 ... 
$ gear: num 4 4 4 3 3 3 3 4 4 4 ... 
$ carb: num 4 4 1 1 2 1 4 2 2 4 ... 
> ddply(mtcars, .(cyl), mean) 
     mpg cyl  disp  hp  drat  wt  qsec  vs  am  gear 
1 26.66364 4 105.1364 82.63636 4.070909 2.285727 19.13727 0.9090909 0.7272727 4.090909 
2 19.74286 6 183.3143 122.28571 3.585714 3.117143 17.97714 0.5714286 0.4285714 3.857143 
3 15.10000 8 353.1000 209.21429 3.229286 3.999214 16.77214 0.0000000 0.1428571 3.285714 
     carb 
1 1.545455 
2 3.428571 
3 3.500000 

하지만 내 그룹화 변수가 발생하면 문제가 발생합니다. ddply()은 요인의 각 수준 ( )에 대해 mean() 인수를 사용할 수 없으므로 경고를 표시합니다.

> mtcars$cyl <- as.factor(mtcars$cyl) 
> str(mtcars) 
'data.frame': 32 obs. of 11 variables: 
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ... 
$ cyl : Factor w/ 3 levels "4","6","8": 2 2 1 2 3 2 3 1 1 2 ... 
$ disp: num 160 160 108 258 360 ... 
$ hp : num 110 110 93 110 175 105 245 62 95 123 ... 
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ... 
$ wt : num 2.62 2.88 2.32 3.21 3.44 ... 
$ qsec: num 16.5 17 18.6 19.4 17 ... 
$ vs : num 0 0 1 1 0 1 0 1 1 1 ... 
$ am : num 1 1 1 0 0 0 0 0 0 0 ... 
$ gear: num 4 4 4 3 3 3 3 4 4 4 ... 
$ carb: num 4 4 1 1 2 1 4 2 2 4 ... 
> ddply(mtcars, .(cyl), mean) 
     mpg cyl  disp  hp  drat  wt  qsec  vs  am  gear 
1 26.66364 NA 105.1364 82.63636 4.070909 2.285727 19.13727 0.9090909 0.7272727 4.090909 
2 19.74286 NA 183.3143 122.28571 3.585714 3.117143 17.97714 0.5714286 0.4285714 3.857143 
3 15.10000 NA 353.1000 209.21429 3.229286 3.999214 16.77214 0.0000000 0.1428571 3.285714 
     carb 
1 1.545455 
2 3.428571 
3 3.500000 
Warning messages: 
1: In mean.default(X[[2L]], ...) : 
    argument is not numeric or logical: returning NA 
2: In mean.default(X[[2L]], ...) : 
    argument is not numeric or logical: returning NA 
3: In mean.default(X[[2L]], ...) : 
    argument is not numeric or logical: returning NA 
> 

요약 통계를 잘못된 방식으로 생성하려고하는지 궁금합니다.

대개 어떻게 평균 또는 그룹 별 요약 통계 (평균, 표준 편차 등)의 데이터 구조를 생성합니까? ddply() 이외의 것을 사용해야합니까? ddply()을 사용할 수 있다면 내 그룹화 요소의 평균을 취할 때 발생하는 오류를 피하기 위해 어떻게해야합니까?

답변

8

사용 numcolwise(mean) : 함수는 인수 (함수)를 숫자 열에서만 작동하는 함수로 변환합니다

> ddply(mtcars, .(cyl), numcolwise(mean)) 

     cyl  mpg  disp  hp  drat  wt  qsec  vs 
    1 4 26.66364 105.1364 82.63636 4.070909 2.285727 19.13727 0.9090909 
    2 6 19.74286 183.3143 122.28571 3.585714 3.117143 17.97714 0.5714286 
    3 8 15.10000 353.1000 209.21429 3.229286 3.999214 16.77214 0.0000000 
      am  gear  carb 
    1 0.7272727 4.090909 1.545455 
    2 0.4285714 3.857143 3.428571 
    3 0.1428571 3.285714 3.500000 
+1

감사합니다. Prasad! 나는 또한'ddply()'호출 대신'aggregate()'호출을 사용할 수 있다는 것을 깨닫지 못했습니다. 예 :'aggregate (cbind (hp, mpg) ~ cyl, data = mtcars, mean)'. – briandk

+0

너무 좋은 방법입니다! –

+0

프라 사드, 그건 쉬운 속임수입니다. –

2

여기에 대한 대답은 아니지만 관찰입니다. 이 문제는 ddply() 그 자체가 아닙니다. 이거 봐요.

aggregate(mtcars, by=list(mtcars$cyl), mean) 
apply(mtcars, 2, function(col) tapply(col, INDEX=mtcars$cyl, FUN=mean)) 

그러나 이후 mtcars$cyl <- as.factor(mtcars$cyl) 위의 작업도

, R 요인의 컬럼의 평균을하는 방법을 알고하지 않기 때문에 다음 잘 작동 모두 수단의 테이블을 생성합니다. 우리는 그 열을 제거하여 그것을 피할 수 mean()에 전달하는 일에서 ("CYL은"열 2) :

aggregate(mtcars[ , -2], by=list(mtcars$cyl), mean) 
apply(mtcars[ , -2], 2, function(col) tapply(col, INDEX=mtcars$cyl, FUN=mean)) 

하지만 꽤 투박합니다.

+0

감사합니다! 나는 그 자신을 시도했고, 당신은 절대적으로 옳았습니다. 문제는 R이 요인의 평균을 취하는 방법을 모르고 있으며, 나는 그것을 극복하기위한 방법으로 고심하고있었습니다. 'aggregate()'는 포함 할 컬럼을 지정할 수있게합니다. 'aggregate (cbind (hp, mpg) ~ cyl, data = mtcars, mean)' – briandk