2015-11-04 116 views
1

我有一個名爲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://stackoverflow.com/editing-help) – Jaap

+0

嗨Jaap,感謝您的建議,但表值如何顯示 – Pallavi

+0

您可以更新預期的輸出。 – akrun

回答

1

不清楚預期的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

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