Summary

R의 데이터를 다루다 보면, 그룹별 계산하는 경우가 많다. 또는 그룹의 서브 그룹별 퍼센트를 계산해야 하는 경우도 많다.

여러가지 방법이 있지만, 여기서는 dplyr 패키지를 이용해서 서브 그룹의 빈도수에 대한 비중을 계산해보도록 한다. 데이터는 R에 UsingR 패키지의 survery 데이터를 사용한다. 설치는 install.packages(“UsingR”) 이라고 하면 된다.

데이터내에서 Sex(성별), Smoke(담배피는 경우)는 범주형 변수로 되어 있다. 각 행은 하나의 관측치가 된다.

먼저 survey 데이터의 요약을 살펴본다.

library(dplyr)
library(UsingR)

summary(survey)
##      Sex          Wr.Hnd          NW.Hnd        W.Hnd          Fold    
##  Female:118   Min.   :13.00   Min.   :12.50   Left : 18   L on R : 99  
##  Male  :118   1st Qu.:17.50   1st Qu.:17.50   Right:218   Neither: 18  
##  NA's  :  1   Median :18.50   Median :18.50   NA's :  1   R on L :120  
##               Mean   :18.67   Mean   :18.58                            
##               3rd Qu.:19.80   3rd Qu.:19.73                            
##               Max.   :23.20   Max.   :23.50                            
##               NA's   :1       NA's   :1                                
##      Pulse             Clap       Exer       Smoke         Height     
##  Min.   : 35.00   Left   : 39   Freq:115   Heavy: 11   Min.   :150.0  
##  1st Qu.: 66.00   Neither: 50   None: 24   Never:189   1st Qu.:165.0  
##  Median : 72.50   Right  :147   Some: 98   Occas: 19   Median :171.0  
##  Mean   : 74.15   NA's   :  1              Regul: 17   Mean   :172.4  
##  3rd Qu.: 80.00                            NA's :  1   3rd Qu.:180.0  
##  Max.   :104.00                                        Max.   :200.0  
##  NA's   :45                                            NA's   :28     
##        M.I           Age       
##  Imperial: 68   Min.   :16.75  
##  Metric  :141   1st Qu.:17.67  
##  NA's    : 28   Median :18.58  
##                 Mean   :20.37  
##                 3rd Qu.:20.17  
##                 Max.   :73.00  
## 
head(survey)
##      Sex Wr.Hnd NW.Hnd W.Hnd    Fold Pulse    Clap Exer Smoke Height
## 1 Female   18.5   18.0 Right  R on L    92    Left Some Never 173.00
## 2   Male   19.5   20.5  Left  R on L   104    Left None Regul 177.80
## 3   Male   18.0   13.3 Right  L on R    87 Neither None Occas     NA
## 4   Male   18.8   18.9 Right  R on L    NA Neither None Never 160.00
## 5   Male   20.0   20.0 Right Neither    35   Right Some Never 165.00
## 6 Female   18.0   17.7 Right  L on R    64   Right Some Never 172.72
##        M.I    Age
## 1   Metric 18.250
## 2 Imperial 17.583
## 3     <NA> 16.917
## 4   Metric 20.333
## 5   Metric 23.667
## 6 Imperial 21.000

이제 Sex, Smoke별 빈도수를 별도의 데이터셋으로 설정한다.

df_data <- survey %>% group_by(Sex, Smoke) %>% summarise(total = n())

먼저 group_by() 함수의 그룹핑되는 기준 컬럼을 전달한다. 해당 컬럼을 기준으로 갯수를 카운트 하게끔 summarise()를 호출하면서 내부에 n()함수를 이용해 갯수 정보를 total에 할당한다.

head(df_data)
## # A tibble: 6 x 3
## # Groups:   Sex [2]
##      Sex  Smoke total
##   <fctr> <fctr> <int>
## 1 Female  Heavy     5
## 2 Female  Never    99
## 3 Female  Occas     9
## 4 Female  Regul     5
## 5   Male  Heavy     6
## 6   Male  Never    89

이제 Sex 별 전체 합산을 한 후 동일 Sex 내에서 Smoke의 비중이 어떻게 되는지 계산한다.

df_data.1 <- df_data %>% group_by(Sex) %>% mutate(percent = total / sum(total))

마찬가지로 group_by()를 호출하면서 대분류인 Sex컬럼을 전달한다. 성별로 그룹핑되고, 각 성별로 그룹핑 적용된 sum(total) 함수가 먼저 계산된다. 그리고 이 값을 이용해 total을 나눈 후 percent라는 신규 컬럼으로 할당한다.

df_data.1
## # A tibble: 10 x 4
## # Groups:   Sex [3]
##       Sex  Smoke total     percent
##    <fctr> <fctr> <int>       <dbl>
##  1 Female  Heavy     5 0.042372881
##  2 Female  Never    99 0.838983051
##  3 Female  Occas     9 0.076271186
##  4 Female  Regul     5 0.042372881
##  5   Male  Heavy     6 0.050847458
##  6   Male  Never    89 0.754237288
##  7   Male  Occas    10 0.084745763
##  8   Male  Regul    12 0.101694915
##  9   Male     NA     1 0.008474576
## 10     NA  Never     1 1.000000000

이상으로 sub group별 percentage 계산하는 방법을 정리해보았다.