R - 变量之间的高级循环

时间:2015-08-27 17:46:51

标签: r loops probability

我希望对两种不同渠道的各种产品(数千种)的销售价格做一些高级循环/概率。以下是一些示例原始数据,它采用适合此逻辑的格式:我相信:

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个区域除以总组合

提前致谢!!

1 个答案:

答案 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, '-')))
}