0

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

    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"))

我想要做的是获得 Item_Qty 的总和以及每个 Wk_Num+Brand 组合的 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+Brand 组合的所有总买家(即渗透率)的买家百分比。我也可以修改上面的代码来计算长度(以获得每个组合的“买家”数量),即

   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
4

2 回答 2

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
于 2013-01-09T13:51:15.260 回答
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"]
于 2013-01-09T14:01:34.700 回答