티스토리 뷰

반응형

그룹 연산 

 


1tapply() 함수


tapply(vector, index, function)  # 벡터만 가능



2aggregate() 함수


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



반응형
댓글
최근에 올라온 글
최근에 달린 댓글
링크
Total
Today
Yesterday