我希望对两种不同渠道的各种产品(数千种)的销售价格做一些高级循环/概率。以下是一些示例原始数据,它采用适合此逻辑的格式:我相信:
SKU <- c('sku1','sku1','sku2','sku2','sku2','sku3','sku3','sku3','sku3','sku4','sku4','sku5','sku5','sku5','sku5','sku5','sku5','sku6','sku6','sku6','sku6','sku6','sku6','sku7','sku7','sku7','sku7')
PRICE <- c(10,20,25,25,40,31,32,33,34,41,42,50,51,52,53,54,55,60,61,62,63,64,65,70,71,72,73)
QTY <- c(1,2,1,1,3,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1)
AREA <- c('area 1','area 2','area 1','area 2','area 2','area 2','area 1','area 2','area 2','area 1','area 2','area 2','area 1','area 2','area 2','area 2','area 2','area 2','area 1','area 2','area 2','area 1','area 2','area 2','area 2','area 1','area 2')
df <- data.frame(SKU,PRICE,QTY,AREA)
我想知道的每个SKU是区域1对区域2的价格越大的次数,区域2对区域1的次数越大,次数相等的次数,总组合和%s这三次中的每一次。
每个SKU的总组合为=
(区域1(唯一价格数量*数量))*(区域2(唯一价格数量*数量))
以下是最终输出的示例:
sku_name <- c('sku1','sku2','sku3','sku4','sku5','sku6','sku7')
area1greater <- c('0','0','1','0','1','7','3')
area2greater <- c('2','3','3','1','4','5','1')
areasequal <- c('0','1','0','0','0','0','0')
total_combos <- c('2','4','4','1','5','12','4')
df2 <- data.frame(sku_name,area1greater,area2greater,areasequal,total_combos)
和%s将很容易从这里,因为它只是3个区域除以总组合
提前致谢!!
答案 0 :(得分:0)
让我们首先关注单个SKU的情况,以获得基础公式。
可能有更优雅的方法来解决这个问题,但我们可以使用outer
生成两个区域rle.inverse
的价格表的外部产品,以生成价格表的平面版本(如果60出现时数量为2,我们只显示60次),然后sign
得到差异{-1,0,1}
和table
来获取每个
我们以简化形式查看sku6
-
> table(sign(outer(c(60, 62, 63, 65), c(61, 64, 64), '-')))
-1 1
7 5
这为我们提供了理想的结果。
comparesku <- function(df) {
df.split <- split(df, df$AREA)
area1 <- df.split[[1]]
area2 <- df.split[[2]]
flat.area1 <- inverse.rle(list(lengths=area1$QTY, values=area1$PRICE))
flat.area2 <- inverse.rle(list(lengths=area2$QTY, values=area2$PRICE))
table(sign(outer(flat.area1, flat.area2, '-')))
}