我有一个带有客户ID的销售skus数据集。
dtSales = data.table(sku = c("a", "b", "b", "c", "b","b", "c", "d", "b", "a"),
qty = c(1,1,1,2,1,3,2,1,4,2),
customer = c(1,1,2,2,3,1,1,1,4,1))
id sku qty customer
1: 1 a 1 1
2: 2 b 1 1
3: 3 b 1 2
4: 4 c 2 2
5: 5 b 1 3
6: 6 b 3 1
7: 7 c 2 1
8: 8 d 1 1
9: 9 b 4 4
10: 10 a 2 1
我可以找到每个sku的购买次数以及购买每种产品的顾客数量。
dtSales[,.(ttlqty=sum(qty), distinctCustomer= length(unique(customer))) ,by=sku][order(-ttlqty)]
sku ttlqty distinctCustomer
1: b 10 4
2: c 4 2
3: a 3 1
4: d 1 1
我想为客户提供累积计数。 第一排:有多少不同的客户购买了产品1 第二行:有多少不同的客户购买了产品1或产品2 ...
由于
答案 0 :(得分:2)
听起来好像你想要一个累积的客户联盟。 Reduce
accumulate=TRUE
(cu<-Reduce(function(x,y) union(x,y),
Map(unique,split(df$customer,df$sku)), acc=TRUE))
按照与levels(df$sku)
相同的顺序生成购买产品a
,产品a
或b
等的客户的累积合并。
[[1]] [1] 1 [[2]] [1] 1 2 3 4 [[3]] [1] 1 2 3 4 [[4]] [1] 1 2 3 4
最后,我们可以得到每个的长度并与水平一起放置
data.frame(sku=levels(df$sku),cc=sapply(cu,length))
sku cc 1 a 1 2 b 4 3 c 4 4 d 4
请注意,我始终使用data.frame
和基本函数。
答案 1 :(得分:1)
感谢A. Webb。指向Reduce。我希望将结果从最畅销的产品分类到较少销售,所以我适应了。
最终解决方案
library(data.table)
dtSales = data.table(sku = c("a", "b", "b", "c", "b","b", "c", "d", "c", "a"),
qty = c(1,1,1,2,1,3,2,1,4,2),
customer = c(1,1,2,2,3,1,1,1,4,1))
#convert sku column to factor
dtSales$sku <- as.factor(dtSales$sku)
#find how many times each sku was bought and sort from high to low
orderedSku = dtSales[,.(ttlqty=sum(qty), distinctCustomer= length(unique(customer))) ,by=sku][order(-ttlqty)]
#order the sku from most sold to less sold
dtSales$sku <- factor(dtSales$sku, levels= orderedSku$sku)
#cumulative distinct count of customers
cu<-Reduce(function(x,y) union(x,y), Map(unique,split(dtSales$customer, dtSales$sku)), acc=TRUE)
#merge the results
data.frame(sku=levels(dtSales$sku), qty=orderedSku$ttlqty, cc=sapply(cu,length))