2016-11-05 13 views
0

Я застрял во время работы над тенденциями. Моя проблема похожа на этот ниже поток, но у меня есть одна дополнительная переменная, называемая «item».Определите тенденцию продаж с несколькими переменными, такими как идентификатор клиента/товар и т. Д.

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 -в-т). Это какой-то стандартный пример или домашнее задание? – smci

+0

Часть о том, как [группировать таблицу данных по нескольким столбцам?] (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'. nswer. – smci

 Смежные вопросы

  • Нет связанных вопросов^_^