2013-01-09 199 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)'的結果,而不是每次爲每個組計算相同的數字。 –