2013-01-09 51 views
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的总和与ITEM_PRICE的每个Wk_Num +品牌组合的平均值。我设法得到我想要通过如下:

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 +品牌组合的唯一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

可以使用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 
+0

这一工程真的很好! Vielen Dank,斯文! – jacatra

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"] 
+1

+1由于'unique'相对较贵,因此可以首先为速度存储'unique(x.dt $ Cust_Num)'的结果,而不是每次为每个组计算相同的数字。 –