我正在尝试根据包含以下列的数据创建摘要:
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
答案 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"]