根据条件计算各列值的平均值
问题描述:
我有一个名为sampleframe
的数据框,其中存储了所有的表值。在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销售1个月的平均价格。
我已经使用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 else 0
答
不清楚预期的ou tput的。根据关于每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
答
解决方案可以通过使用库(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
请学习如何[格式化您的问题文本](http://*.com/editing-help) – Jaap
嗨Jaap,感谢您的建议,但表值如何显示 – Pallavi
您可以更新预期的输出。 – akrun