我有一个名为sampleframe
的data.frame,我存储了所有表值。在sampleframe
内,我有id
,month
,sold
列。
id month SMarch SJanFeb churn
101 1 0.00 0.00 1
101 2 0.00 0.00 1
101 3 0.00 0.00 1
108 2 0.00 6.00 1
103 2 0.00 10.00 1
160 1 0.00 2.00 1
160 2 0.00 3.00 1
160 3 0.50 0.00 0
164 1 0.00 3.00 1
164 2 0.00 6.00 1
我想根据ID
计算过去三个月的平均销售量。如果是第3个月,则必须根据ID考虑过去两个月的平均销售额,如果是2个月则必须根据ID分别考虑所有月份的平均销售量。
我使用ifelse
和mean
函数来利用它,但是当我尝试将它用于所有月份时,有些行丢失了
查询我用于执行
sampleframe$Churn <- ifelse(sampleframe$Month==4|sampleframe$Month==5|sampleframe$Month==6, ifelse(sampleframe$Sold<0.7*mean(sampleframe$Sold[sampleframe$ID[sampleframe$Month==-1&sampleframe$Month==-2&sampleframe$Month==-3]]),1,0),0)
根据查询的逻辑添加它应该与前几个月的销售价值70%进行比较,如果当前值高于之前的平均月值,那么它应该返回1其他0
答案 0 :(得分:1)
不清楚预期的产量。根据有关计算每3个月平均“已售出”的说明(按“ID”分组),我们可以使用roll_mean
中的library(RcppRoll)
。我们将'data.frame'转换为'data.table'(setDT(df1)
),按'id'分组,if
行数大于1,我们得到roll_mean
将n
指定为3并与小于3或else
的平均值连接,即1次观察,得到值本身。
library(RcppRoll)
library(data.table)
k <- 3
setDT(df1)[, soldAvg := if(.N>1) c(cumsum(sold[1:(k-1)])/1:(k-1),
roll_mean(sold,n=k, align='right')) else as.numeric(sold), id]
df1
# id month sold soldAvg
#1: 101 1 124 124.0000
#2: 101 2 211 167.5000
#3: 104 3 332 332.0000
#4: 105 4 124 124.0000
#5: 101 5 211 182.0000
#6: 101 6 332 251.3333
#7: 101 7 124 222.3333
#8: 101 8 211 222.3333
#9: 101 9 332 222.3333
#10: 102 10 124 124.0000
#11: 102 12 211 167.5000
#12: 104 3 332 332.0000
#13: 105 4 124 124.0000
#14: 102 5 211 182.0000
#15: 102 6 332 251.3333
#16: 106 7 124 124.0000
#17: 107 8 211 211.0000
#18: 102 9 332 291.6667
#19: 103 11 124 124.0000
#20: 103 2 211 167.5000
#21: 108 3 332 332.0000
#22: 108 4 124 228.0000
#23: 109 5 211 211.0000
#24: 103 6 332 222.3333
#25: 104 7 124 262.6667
#26: 105 8 211 153.0000
#27: 103 10 332 291.6667
答案 1 :(得分:0)
上述问题的解决方案可以使用库(dplyr)完成并使用此查询来获取输出
resultData <- group_by(data, KId) %>%
arrange(sales_month) %>%
mutate(monthMinus1Qty = lag(quantity_sold,1), monthMinus2Qty = lag(quantity_sold, 2)) %>%
group_by(KId, sales_month) %>%
mutate(previous2MonthsQty = sum(monthMinus1Qty, monthMinus2Qty, na.rm = TRUE)) %>%
mutate(result = ifelse(quantity_sold/previous2MonthsQty >= 0.6,0,1)) %>%
select(KId,sales_month, quantity_sold, result)
链接以参考解决方案并输出Answer