티스토리 뷰
그룹 연산
1. tapply() 함수
tapply(vector, index, function) # 벡터만 가능
그룹 연산 tapply() 함수 참고
2. aggregate() 함수
aggregate() 함수는 tapply() 함수와 유사하게 그룹 연산을 수행합니다.
## method for class 'data.frame'
aggregate(x, # 연산 대상, date frame 가능
by, # group by 컬럼, list로 전달, 여러 컬럼 전달 가능
FUN) # 함수
# student data에서 학년별 키와 몸무게의 평균
> std <- read.csv("student.csv", stringsAsFactors = F)
> aggregate(std[,c('HEIGHT','WEIGHT')],
+ by = list(std$GRADE),
+ mean)
Group.1 HEIGHT WEIGHT
1 1 170.4 62.4
2 2 175.6 67.4
3 3 166.6 51.4
4 4 175.8 68.2
# student data에서 학년별, 학과별 키와 몸무게의 평균
> aggregate(std[,c('HEIGHT','WEIGHT')],
+ by = list(std$GRADE, std$DEPTNO1),
+ mean)
Group.1 Group.2 HEIGHT WEIGHT
1 1 101 162.0 48.0
2 2 101 182.0 72.0
3 3 101 164.0 48.0
...
16 4 202 182.0 70.0
17 2 301 184.0 62.0
18 3 301 160.0 58.0
## method for class 'formula'
aggregate(formula, # 연산 대상 ~ group by 컬럼
data, # 위를 포함한 전체 데이터 셋
FUN)
# student data에서 '학년별' '키와 몸무게'의 평균
> aggregate(HEIGHT + WEIGHT ~ GRADE, # formula의 연산 대상의 '+' 는 컬럼의 확장 X
+ std,
+ mean)
GRADE HEIGHT + WEIGHT # formula의 연산 대상의 '+' 는 말 그대로 연산
1 1 232.8
2 2 243.0
3 3 218.0
4 4 244.0
> aggregate(cbind(HEIGHT, WEIGHT) ~ GRADE, # 연산 대상의 컬럼 확장은 cbind() 사용
+ std,
+ mean)
GRADE HEIGHT WEIGHT
1 1 170.4 62.4
2 2 175.6 67.4
3 3 166.6 51.4
4 4 175.8 68.2
# student data에서 '학년별, 학과별' '키와 몸무게'의 평균
> aggregate(cbind(HEIGHT, WEIGHT) ~ GRADE + DEPTNO1, # group by 는 '+'로 확장 가능
+ std,
+ mean)
GRADE DEPTNO1 HEIGHT WEIGHT
1 1 101 162.0 48.0
2 2 101 182.0 72.0
3 3 101 164.0 48.0
...
16 4 202 182.0 70.0
17 2 301 184.0 62.0
18 3 301 160.0 58.0
# studnet와 exam 파일을 사용하여 학생들의 '성별, 학년별' '시험성적 평균'
> std <- read.csv("student.csv", stringsAsFactors = F)
> exam <- read.csv("exam_01.csv", stringsAsFactors = F)
> df_std <- merge(std, exam, by = 'STUDNO')[ , c('STUDNO','JUMIN','GRADE','TOTAL')] # STD와 EXAM 데이터 병합
> df_std
STUDNO JUMIN GRADE TOTAL GENDER
1 9411 7.510232e+12 4 97 M
2 9412 7.502241e+12 4 78 M
...
19 9714 7.803242e+12 1 83 M
20 9715 7.802232e+12 1 84 F
> df_std$GENDER <- ifelse(substr(df_std$JUMIN,7,7)=='1', 'M', 'F')
> df_std$GENDER
[1] "M" "M" "F" "M" "M" "F" "F" "F" "F" "F" "M" "M" "M" "M" "M" "F" "M" "M" "M" "F"
## method for class 'formula'
> aggregate(TOTAL ~ GENDER + GRADE, # 성별 + 학년별 : 시험성적 평균
+ df_std,
+ mean)
GENDER GRADE TOTAL
1 F 1 87.50000
2 M 1 84.33333
3 M 2 84.20000
4 F 3 86.80000
5 F 4 83.00000
6 M 4 81.25000
## method for class 'data.frame'
> aggregate(df_std[,c('TOTAL')],
+ by = list(df_std$GENDER ,df_std$GRADE),
+ mean)
Group.1 Group.2 x
1 F 1 87.50000
2 M 1 84.33333
3 M 2 84.20000
4 F 3 86.80000
5 F 4 83.00000
6 M 4 81.25000
'R > Process' 카테고리의 다른 글
[R] R에서 SQL문법으로 데이터 조작하기 - sqldf 패키지 (0) | 2019.01.08 |
---|---|
[R] plyr 패키지로 그룹(join) 연산 하기 - adply(), ddply() 함수 (0) | 2019.01.08 |
[R] 데이터에서 최소(min), 최대(max)를 갖는 색인 출력 - which.min(), which.max() (0) | 2019.01.07 |
[R] 데이터 병합(merge) - Join, Outer Join, Self Join (0) | 2019.01.07 |
[R] 데이터 구조 변경 - stack, unstack (0) | 2019.01.07 |