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 계산하는 방법을 정리해보았다.