2016-11-05 49 views
0

我在處理趨勢時陷入困境。我的問題類似於下面的線程,但我有一個額外的變量稱爲'項目'。確定具有多個變量(如客戶ID /項目等)的銷售趨勢

How to determine trend of time-series of values in R

我的最終結果將是象下面這樣的樣品。請幫助

Customer_ID Item Sales_Slope 
Josh  milk  Positive 
Josh   eggs  Negative 
Eric   milk  Mixed 
Eric   eggs  postive 

我的數據:

require("data.table") 
dat <- data.table(
      customer_ID=c(rep("Josh",6),rep("Ray",7),rep("Eric",7)), 
      item=c(rep("milk",3),rep("eggs",3),rep("milk",4),rep("eggs",3),rep("milk",3),rep("eggs",4)), 
      sales=c(35,50,65,65,52,49,15,10,13,9,35,50,65,65,52,49,15,10,13,9)) 

dat[,transaction_num:=seq(1,.N), by=c("customer_ID")] 
+0

除了data.table和「通過」鍵詢問多次,這具有強相似/是[如何確定R中一系列值的趨勢]的可能重複(http://stackoverflow.com/questions/23600385/how-to-determine-trend-of-a-series-of-values -in-R)。這些是一些標準的例子還是作業? – smci

+0

有關如何[如何將data.table分組爲多個列?](https://stackoverflow.com/questions/12478943/r-data-table-group-by-multiple-columns)的部分是使用'by = list(「customer_ID」,「item」)',而不是'by = c(...)' – smci

+0

@smci - 您的解決方案不起作用。錯誤:[.data.table'中的錯誤(數據,列表(N.Minus.1 = .N-1,Change = list(sales [transaction_num +: 'by'或'keyby'列表中的項目是長度(1,1),每個長度必須與x中的行或i(20)返回的行數相同。 – Murali

回答

1

和我概括是data.table方法:

require(data.table) 

trend <- function(x) { 
    ifelse(all(diff(x)>0), 'Positive', 
    ifelse(all(diff(x)<0), 'Negative', 'Mixed')) 
} 

dat[, trend(sales), by=c("customer_ID","item")] 
    customer_ID item  V1 
1:  Josh milk Positive 
2:  Josh eggs Negative 
3:   Ray milk Mixed 
4:   Ray eggs Positive 
5:  Eric milk Negative 
6:  Eric eggs Mixed 

# or if you want to assign the result... 
dat[, Sales_Slope:=trend(sales), by=c("customer_ID","item")] 
1

我與@smci同意,所有從該鏈接改變的是「通過」可變有所增加。我希望這個解決方案可以清楚

> library(plyr) 
> abc <- function(x){ 
    if(all(diff(x$sales)>0)) return('Positive') 
    if(all(diff(x$sales)<0)) return('Negative') 
    return('Mixed') 
    } 

y= ddply(dat, .(customer_ID, item), abc) 
y 
    customer_ID item  V1 
1  Eric eggs Mixed 
2  Eric milk Negative 
3  Josh eggs Negative 
4  Josh milk Positive 
5   Ray eggs Positive 
6   Ray milk Mixed 
+0

謝謝你們倆。解決方案的工作就像魅力:-)非常感謝,並感謝您對社區的貢獻。我們喜歡R – Murali

+0

很高興我可以幫助! –

+0

嵌套的'ifelse(...)'是一個更好的更清潔的成語,它也允許你把它寫成一個表達式而不用''return'語句混淆它​​。參見我的a nswer。 – smci