Google AdSense (text)

hidden logo stop

Moving

거지 같은 이글루스 광고노출 정책이 싫어서,
새 보금자리(http://blog.leocat.kr/)로 이사감.

[R] 일부 column으로 그룹핑하기 (group by) Computer & Program

다음과 같은 데이터들을 특정 필드로 묶어서 총합이나 평균 등을 나타내고 싶을 경우가 있다. 간단히 말하면 DBMS에서 group by가 필요한 것이다.

Date Category Frequency
2013-10-01  First    10
2013-10-02  First    15
2013-10-02  First    5
2013-10-02  Second  2
2013-10-01  Third     14
2013-10-02  Third     20
2013-10-02  Second  3

위의 데이터를 Category column을 기준으로 그룹핑해서 아래처럼 변경하고 싶다. 어떻게 해야할까??

Category Frequency
First    30
Second  5
Third     34

또는 아래처럼 Date와 Category column을 함께 그룹핑하려면??

Date Category Frequency
2013-10-01  First    10
2013-10-01  Third     14
2013-10-02  First    20
2013-10-01  Second  5
2013-10-01  Third     20



ddply, SummaryBy, aggregate 등 사용하는 여러 방법이 있다. (Cookbook for R - Summarizing data, sorting - How to group columns by sum in R - Stack Overflow) 여기서는 일부 편하게 사용할 수 있는 것들 위주로 정리하겠다.

> x <- data.frame(Date=as.Date(c('2013-10-01', '2013-10-02', '2013-10-02', '2013-10-02', '2013-10-01', '2013-10-02', '2013-10-02')), Category=factor(c('First', 'First', 'First', 'Second', 'Third', 'Third', 'Second')), Frequency=c(10, 15, 5, 2, 14, 20, 3))
> x
Date Category Frequency
1 2013-10-01 First 10
2 2013-10-02 First 15
3 2013-10-02 First 5
4 2013-10-02 Second 2
5 2013-10-01 Third 14
6 2013-10-02 Third 20
7 2013-10-02 Second 3



ddply {plyr}
> library(plyr)
> ddply(x, .(Category), summarize, Sum_F=sum(Frequency))
Category Sum_F
1 First 30
2 Second 5
3 Third 34
> ddply(x, .(Date, Category), summarize, Sum_F=sum(Frequency))
Date Category Sum_F
1 2013-10-01 First 10
2 2013-10-01 Third 14
3 2013-10-02 First 20
4 2013-10-02 Second 5
5 2013-10-02 Third 20


aggregate {stats}
> aggregate(x$Frequency, by=list(Category=x$Category), FUN=sum)
Category x
1 First 30
2 Second 5
3 Third 34
> aggregate(x$Frequency, by=list(Date=x$Date, Category=x$Category), FUN=sum)
Date Category x
1 2013-10-01 First 10
2 2013-10-02 First 20
3 2013-10-02 Second 5
4 2013-10-01 Third 14
5 2013-10-02 Third 20


summaryBy {doBy}
> library(doBy)
> summaryBy(Frequency~Category, data=x, FUN=sum)
Category Frequency.sum
1 First 30
2 Second 5
3 Third 34
> summaryBy(Frequency~Date+Category, data=x, FUN=sum)
Date Category Frequency.sum
1 2013-10-01 First 10
2 2013-10-01 Third 14
3 2013-10-02 First 20
4 2013-10-02 Second 5
5 2013-10-02 Third 20




- 참고
Cookbook for R - Summarizing data
sorting - How to group columns by sum in R - Stack Overflow

덧글

댓글 입력 영역

Google AdSense (text/image)