R累计不同数量的客户和产品

时间:2016-01-31 22:49:38

标签: r data.table

我有一个带有客户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 ...

由于

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,产品ab等的客户的累积合并。

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