根据条件计算各列值的平均值

问题描述:

我有一个名为sampleframe的数据框,其中存储了所有的表值。在sampleframe里面我有idmonth,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销售1个月的平均价格。

我已经使用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 else 0

+0

请学习如何[格式化您的问题文本](http://*.com/editing-help) – Jaap

+0

嗨Jaap,感谢您的建议,但表值如何显示 – Pallavi

+0

您可以更新预期的输出。 – akrun

不清楚预期的ou tput的。根据关于每3个月计算平均“销售”的描述,按'id'分组,我们可以使用roll_meanlibrary(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 
+0

当我尝试在R studio中执行上述语句时安装库文件后,它显示“找不到函数roll_mean“ – Pallavi

+0

@Plalavi它在'RcppRoll'中。你安装了它吗? – akrun

+0

我已经安装了它:) – Pallavi

解决方案可以通过使用库(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