基于多个分类变量的数据摘要

时间:2013-01-09 12:21:24

标签: r summary

我正在尝试根据包含以下列的数据创建摘要:

    Trx_Date   Brand   Cust_Num   Item_Qty   Item_Price

我正在尝试根据不同的品牌(角色对象类)创建一年中每周的Item_Qty和Item_Amt的摘要。我已经设法通过以下方式创建Wk_Num:

    Wk_Num <- as.character(strftime(as.POSIXlt(Trx_Date), format="%W"))

我想要做的是获得每个Wk_Num + Brand组合的Item_Qty和Item_Price的平均值之和。我设法通过以下方式获得我想要的东西:

   tblsum <- summary(Item_Price + Item_Qty ~ Wk_Num + Brand, data=tblorig, FUN = function(x) { c(m = mean(x), s= sum(x))})

我想要做的是创建另一列,计算每个特定Wk_Num +品牌组合的所有买家(即渗透)的买家百分比。我可以修改上面的代码来计算长度(以获得每个组合的“买家”数量),即

   tblsum <- summary(Item_Price + Item_Qty ~ Wk_Num + Brand, data=tblorig, FUN = function(x) { c(m = mean(x), s= sum(x), l=length(x))})

然而,这也存在缺陷,因为顾客实际上可能会在一周内多次购买并且会被重复计算。

我仍然处于 R 之旅的早期阶段,并尝试优雅地编码。有没有一种很好的方法来组合我从第一个代码构建的数据摘要,以及计算每个Wk_Num + Brand组合的唯一Cust_Num的百分比超过唯一Cust_Num的总数?

我们也非常感谢代码的任何改进。

更新

示例数据:

 Wk_Num   Brand      Cust_Num   Item_Qty   Item_Price
 11       AAA           001          1          2.1
 11       BBB           001          1          1.4
 11       AAA           002          2          2.1
 12       CCC           003          1          1.5
 12       BBB           001          3          1.4
 12       BBB           001          2          1.4
 12       BBB           004          1          1.5
 12       CCC           004          1          1.5
 13       AAA           002          2          2.2
 13       AAA           001          3          2.1
 13       AAA           003          1          2.2
 13       AAA           004          2          2.1

输出结果是理想的:

 Wk_Num   Brand     Total Item  Avg Item Price   Penetration
 11       AAA             3        2.10              50%         # 2 out of 4
 11       BBB             1        1.40              25%         # 1 out of 4
 12       BBB             6        1.43              50%         # 2 out of 4 (Cust 001 bought twice in that week)
 12       CCC             1        1.50              25%         # 1 out of 4
 13       AAA             8        2.15             100%         # 4 out of 4

2 个答案:

答案 0 :(得分:4)

您可以使用ddply包中的plyr功能:

(假设数据框称为dat。)

library(plyr)
ddply(dat, .(Wk_Num, Brand), summarise, 
      Total_Item = sum(Item_Qty), 
      Avg_Item_Price = mean(Item_Price),
      Penetration = length(unique(Cust_Num))/length(unique(dat$Cust_Num)))

结果:

  Wk_Num Brand Total_Item Avg_Item_Price Penetration
1     11   AAA          3       2.100000        0.50
2     11   BBB          1       1.400000        0.25
3     12   BBB          6       1.433333        0.50
4     12   CCC          2       1.500000        0.50
5     13   AAA          8       2.150000        1.00

答案 1 :(得分:3)

使用data.table

require(data.table)
x.dt <- data.table(dat)
yy <- x.dt[, list(Total_Item = sum(Item_Qty), Avg_Item_Price = mean(Item_Price),
            Penetration = length(unique(Cust_Num))/length(unique(x.dt$Cust_Num))), 
            by="Wk_Num,Brand"]