2012-05-15 5 views
3

데이터 프레임의 행들의 그룹들을 결합하는 방법 고투 그래서I가 같은 데이터 프레임이

product_id view_count purchase_count 
1   11   1 
2   20   3 
3   5   2 
... 
I가 VIEW_COUNT 의해 단체가 간격 대한 purchase_count를 요약 테이블에이 변환하고자

예.

view_count_range total_purchase_count 
0-10     45 
10-20    65 

이러한 view_count_ranges는 고정 크기입니다. 이와 같은 범위를 그룹화하는 방법에 대한 제안 사항에 감사드립니다.

답변

5

cut은 이런 종류의 도구입니다.

#First make some data to work with 
#I suggest you do this in the future as it makes it 
#easier to provide you with assistance. 
set.seed(10) 
dat <- data.frame(product_id=1:15, view_count=sample(1:20, 15, replace=T), 
    purchase_count=sample(1:8, 15, replace=T)) 
dat #look at the data 

#now we can use cut and aggregate by this new variable we just created 
dat$view_count_range <- with(dat, cut(view_count, c(0, 10, 20))) 
aggregate(purchase_count~view_count_range, dat, sum) 

산출 : 여기 하나의 방법 타일러의 대답에 확장 및 그의 예를 dat로 시작

view_count_range purchase_count 
1   (0,10]    39 
2   (10,20]    31 
2

을, 당신은 data.table이 같은 쿼리를 작성하기가 쉽고 빠르게 찾을 수 있습니다

> require(data.table) 
> DT = as.data.table(dat) 

> DT[, sum(purchase_count), by=cut(view_count,c(0,10,20))] 
     cut V1 
[1,] (10,20] 31 
[2,] (0,10] 39 

그게 전부입니다. 한 줄로. 읽기 쉽고 쓰기 쉽습니다.

기본적으로 각 그룹이 데이터에 처음 나타나는 순서 (이 데이터 세트의 첫 번째 view_count은 11 임)를 유지하기 때문에 (10,20) 그룹을 먼저 붙이십시오. 대신 그룹을 정렬하려면,

> DT[, sum(purchase_count), keyby=cut(view_count,c(0,10,20))] 
     cut V1 
[1,] (0,10] 39 
[2,] (10,20] 31 

그리고 그 결과 열 이름 : bykeyby에 변경

> DT[,list(purchase_count = sum(purchase_count)), 
    keyby=list(view_count_range = cut(view_count,c(0,10,20)))] 
    view_count_range purchase_count 
[1,]   (0,10]    39 
[2,]   (10,20]    31