집단별 함수 적용
집단별로 함수 적용하기
- 벡터
v
에 한 학급의 학생 키가 저장되어 있다. 이때 남자의 키 평균과 여자의 키 평균을 구하고 싶다면 어떻게 해야 할까? 전체 평균은mean(v)
으로 구할 수 있지만 누가 남자이고 누가 여자인지 모르는 데 어떻게 남자키, 여자키 평균을 구할 수 있는가? - 만약
g
라는 벡터에 벡터v
의 각 원소가 남자(Male
) 키인지 여자(Female
) 키인지가 저장되었다고 한다면 어떤까?v[1]
은 172이고,g[1]
은Male
이라서, 172은 남자키이고,v[2]
는 170이고,g[2]
는Female
이라서 170은 여자키임을 알 수 있다. - 이때에는
mean(v[g=='Male'])
과mean(v[g=='Female'
])로 남자키 평균과 여자키 평균을 알 수 있다(<논리값으로 벡터 참조/> 참조). - 문제는 집단의 갯수가 2개가 아니라 100개라면 어떨까? 예를 들어
v
에는 값이 들어 있고,g
에는 소속이 들어 있는데 소속은1
부터100
까지 100가지나 된다면? 다음의 코드는 그 일부를 보여준다.
set.seed(0)
v <- c(172, 172, 170, 170, rnorm(96, 170, 3))
g <- rep(c("Male", "Female"), 50)
c(mean(v[g=="Male"]), mean(v[g=="Female"]))
## [1] 170.3323 169.7397
#
v <- rnorm(1000, 170, 3)
g <- rep(1:100, 10)
c(mean(v[g==1]), mean(v[g==2]), mean(v[g==3]), mean(v[g==4]))
## [1] 169.2011 170.8637 170.5775 169.8197
- 이제
g==5
,g==6
, …,g==100
을 추가하기만 하면 된다. 이렇게 반복되는 작업이 계속될 때 프로그래머라면 당연히for
문을 찾게된다. R에서는 이런 경우를 위한 특별한 함수가 마련되어 있다.
주어진 벡터에 집단을 구분하여 함수 적용하기 : tapply
tapply
함수는 벡터v
의 원소를 몇 개의 집단으로 나눈 후, 함수func
를 각 집단에 적용한다. 위의 그림에서 원소의 집단을 알려주는 벡터g
의 값에 따라 바탕색을 다르게 하였다.(벡터g
의 원소가1
인 경우는 항상 옅은 회색이고2
인 경우는 하얀색,3
인 경우는 짙은 회색이다.)- 집단 벡터
g
는 집단을 효과적으로 알려주기만 하면 된다. 따라서 집단을 나타내는 벡터g
는 다음 중 어느 것을 사용해도 무방하다.
c(1, 3, 1, 2, 3, 2, 2, 1, 2)
## [1] 1 3 1 2 3 2 2 1 2
c(0, 7, 0, 5, 7, 5, 5, 0, 5)
## [1] 0 7 0 5 7 5 5 0 5
c('A', 'C', 'A', 'B', 'C', 'B', 'B', 'A', 'B')
## [1] "A" "C" "A" "B" "C" "B" "B" "A" "B"
c("paul", "jack", "paul", "susan", "jack", "susan", "susan", "paul", "susan")
## [1] "paul" "jack" "paul" "susan" "jack" "susan" "susan" "paul" "susan"
- 만약 적용되는 함수가
mean
이라면, 그 결과는 다음과 같이 구할 수 있다.
v = c(2, 2, 6, 8, 9, 1, 2, 7, 5)
g = c(1, 3, 1, 2, 3, 2, 2, 1, 2)
tapply(v, g, FUN = mean)
## 1 2 3 ## 5.0 4.0 5.5
집단별로 함수 적용하기 : tapply
, apply
, lapply
, sapply
- 벡터뿐 아니라, 행렬, 리스트, 데이터 프레임에 대해서도 원소들을 여러 집단으로 나눈 후 특정한 함수를 적용할 수 있다.
tapply
,apply
,lapply
,sapply
는 다음과 같은 의미를 가지고 있다.
함수 | 의미 |
---|---|
tapply |
tag–apply |
apply |
array(?)-apply |
lapply |
list–apply |
sapply |
simplified-list-apply |
- 다음의 표는 R에서 집단별로 함수를 적용하는
tapply
,apply
,lapply
,sapply
,aggregate
의 기능을 도식적으로 보여준다. 이들 함수는 적용되는 데이터 구조에 따라 구분될 수 있다.
- 다음은
dat
라는 데이터 프레임을gender
와num
의 값에 따라 나누는 다양한 방법을 보여준다.aggregate
에서+
,cbind
,.
의 의미를 유추해보자.
dat <- data.frame(gender=c('M','M','M','M','M','F','F','F','F','F'),
num=c(1,2,3,1,2,3,1,2,3,1),
h=c(170,180,190,180,170,150,160,170,160,150),
w=c(80,70,100,80,60,50,50,60,60,50))
dat$BMI <- dat$w/(dat$h/100)^2
table(dat$gender, dat$num)
## ## 1 2 3 ## F 2 1 2 ## M 2 2 1
tapply(dat$h, list(dat$gender, dat$num), mean)
## 1 2 3 ## F 155 170 155 ## M 175 175 190
aggregate(h~gender+num, sum, data=dat)
## gender num h ## 1 F 1 310 ## 2 M 1 350 ## 3 F 2 170 ## 4 M 2 350 ## 5 F 3 310 ## 6 M 3 190
aggregate(h+w~gender+num, sum, data=dat)
## gender num h + w ## 1 F 1 410 ## 2 M 1 510 ## 3 F 2 230 ## 4 M 2 480 ## 5 F 3 420 ## 6 M 3 290
aggregate(cbind(h,w)~gender+num, sum, data=dat)
## gender num h w ## 1 F 1 310 100 ## 2 M 1 350 160 ## 3 F 2 170 60 ## 4 M 2 350 130 ## 5 F 3 310 110 ## 6 M 3 190 100
aggregate(.~gender+num, sum, data=dat)
## gender num h w BMI ## 1 F 1 310 100 41.75347 ## 2 M 1 350 160 52.37302 ## 3 F 2 170 60 20.76125 ## 4 M 2 350 130 42.36618 ## 5 F 3 310 110 45.65972 ## 6 M 3 190 100 27.70083
aggregate(dat, list(dat$gender, dat$num), length)
## Group.1 Group.2 gender num h w BMI ## 1 F 1 2 2 2 2 2 ## 2 M 1 2 2 2 2 2 ## 3 F 2 1 1 1 1 1 ## 4 M 2 2 2 2 2 2 ## 5 F 3 2 2 2 2 2 ## 6 M 3 1 1 1 1 1
by(dat, list(dat$gender, dat$num), summary)
## : F ## : 1 ## gender num h w BMI ## F:2 Min. :1 Min. :150.0 Min. :50 Min. :19.53 ## M:0 1st Qu.:1 1st Qu.:152.5 1st Qu.:50 1st Qu.:20.20 ## Median :1 Median :155.0 Median :50 Median :20.88 ## Mean :1 Mean :155.0 Mean :50 Mean :20.88 ## 3rd Qu.:1 3rd Qu.:157.5 3rd Qu.:50 3rd Qu.:21.55 ## Max. :1 Max. :160.0 Max. :50 Max. :22.22 ## -------------------------------------------------------- ## : M ## : 1 ## gender num h w BMI ## F:0 Min. :1 Min. :170.0 Min. :80 Min. :24.69 ## M:2 1st Qu.:1 1st Qu.:172.5 1st Qu.:80 1st Qu.:25.44 ## Median :1 Median :175.0 Median :80 Median :26.19 ## Mean :1 Mean :175.0 Mean :80 Mean :26.19 ## 3rd Qu.:1 3rd Qu.:177.5 3rd Qu.:80 3rd Qu.:26.93 ## Max. :1 Max. :180.0 Max. :80 Max. :27.68 ## -------------------------------------------------------- ## : F ## : 2 ## gender num h w BMI ## F:1 Min. :2 Min. :170 Min. :60 Min. :20.76 ## M:0 1st Qu.:2 1st Qu.:170 1st Qu.:60 1st Qu.:20.76 ## Median :2 Median :170 Median :60 Median :20.76 ## Mean :2 Mean :170 Mean :60 Mean :20.76 ## 3rd Qu.:2 3rd Qu.:170 3rd Qu.:60 3rd Qu.:20.76 ## Max. :2 Max. :170 Max. :60 Max. :20.76 ## -------------------------------------------------------- ## : M ## : 2 ## gender num h w BMI ## F:0 Min. :2 Min. :170.0 Min. :60.0 Min. :20.76 ## M:2 1st Qu.:2 1st Qu.:172.5 1st Qu.:62.5 1st Qu.:20.97 ## Median :2 Median :175.0 Median :65.0 Median :21.18 ## Mean :2 Mean :175.0 Mean :65.0 Mean :21.18 ## 3rd Qu.:2 3rd Qu.:177.5 3rd Qu.:67.5 3rd Qu.:21.39 ## Max. :2 Max. :180.0 Max. :70.0 Max. :21.60 ## -------------------------------------------------------- ## : F ## : 3 ## gender num h w BMI ## F:2 Min. :3 Min. :150.0 Min. :50.0 Min. :22.22 ## M:0 1st Qu.:3 1st Qu.:152.5 1st Qu.:52.5 1st Qu.:22.53 ## Median :3 Median :155.0 Median :55.0 Median :22.83 ## Mean :3 Mean :155.0 Mean :55.0 Mean :22.83 ## 3rd Qu.:3 3rd Qu.:157.5 3rd Qu.:57.5 3rd Qu.:23.13 ## Max. :3 Max. :160.0 Max. :60.0 Max. :23.44 ## -------------------------------------------------------- ## : M ## : 3 ## gender num h w BMI ## F:0 Min. :3 Min. :190 Min. :100 Min. :27.7 ## M:1 1st Qu.:3 1st Qu.:190 1st Qu.:100 1st Qu.:27.7 ## Median :3 Median :190 Median :100 Median :27.7 ## Mean :3 Mean :190 Mean :100 Mean :27.7 ## 3rd Qu.:3 3rd Qu.:190 3rd Qu.:100 3rd Qu.:27.7 ## Max. :3 Max. :190 Max. :100 Max. :27.7
Leave a comment