根据条件

时间:2015-11-04 07:45:22

标签: r

我有一个名为sampleframe的data.frame,我存储了所有表值。在sampleframe内,我有idmonthsold列。

 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分别考虑所有月份的平均销售量。

我使用ifelsemean函数来利用它,但是当我尝试将它用于所有月份时,有些行丢失了

查询我用于执行

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

2 个答案:

答案 0 :(得分:1)

不清楚预期的产量。根据有关计算每3个月平均“已售出”的说明(按“ID”分组),我们可以使用roll_mean中的library(RcppRoll)。我们将'data.frame'转换为'data.table'(setDT(df1)),按'id'分组,if行数大于1,我们得到roll_meann指定为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