【问题标题】:Struggling with how to combine groups of rows in a data frame挣扎于如何组合数据框中的行组
【发布时间】:2012-05-15 01:35:53
【问题描述】:

我有一个这样的数据框

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 的大小是固定的。我将不胜感激有关如何对这样的范围进行分组的任何建议。

【问题讨论】:

    标签: r dataframe data.table


    【解决方案1】:

    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
    

    【讨论】:

      【解决方案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)。改为对组进行排序,将by 更改为keyby

      > 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-06
        • 2014-08-30
        • 1970-01-01
        • 2021-08-05
        • 1970-01-01
        • 2021-02-02
        • 1970-01-01
        • 2021-02-07
        相关资源
        最近更新 更多