3

我有一个像这样的数据框

product_id view_count purchase_count
1           11         1   
2           20         3
3           5          2
...

例如,我想将其转换为按 view_count 分组的表,并对某个时间间隔的 purchase_count 求和。

view_count_range total_purchase_count
0-10                 45
10-20                65

这些 view_count_ranges 将具有固定大小。我将不胜感激有关如何对这样的范围进行分组的任何建议。

4

2 回答 2

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)

产生:

  view_count_range purchase_count
1           (0,10]             39
2          (10,20]             31
于 2012-05-15T01:51:41.997 回答
2

扩展 Tyler 的答案并从他的示例开始dat,您可能会发现在以下位置编写这样的查询更容易、更快捷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

就是这样。就一行。易写,易读。

请注意,它将 (10,20] 组放在首位。这是因为默认情况下,它保留每个组首先出现在数据中的顺序(第一个view_count是该数据集中的 11)。要对组进行排序,请更改bykeyby

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

并命名结果列:

> 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
于 2012-05-15T08:49:22.550 回答