2015-05-27 3 views
0

У меня есть база данных заказов для онлайн-платформы для покупок.Выполнение подсчета внутри групп в dataframe

Таблица, с которой я работаю, выглядит так: каждая строка соответствует одному клиенту/пункту/дате.

OrderHistory <- data.frame(date=c("2015-02-01", "2015-03-01", "2015-04-01", "2015-03-01", "2015-04-01", "2015-05-01", "2015-05-01"), 
      customer=c("A","A","A","B","B","B","B"), 
      item=c("Candy", "Coffee", "Coffee", "Candy", "Candy", "Candy", "Coffee")) 

То, что я хотел бы получить это текущий счет числа каждого члена заказал конкретный пункт, так что я могу запустить анализ, на котором элементы упорядочены повторно одними и теми же клиентами и какие из них заказали один раз и никогда больше.

Выходной сигнал будет выглядеть

out <- data.frame(date=c("2015-02-01", "2015-03-01", "2015-04-01", "2015-03-01", "2015-04-01", "2015-05-01", "2015-05-01"), 
       member=c("A","A","A","B","B","B","B"), 
       item=c("Candy", "Coffee", "Coffee", "Candy", "Candy", "Candy", "Coffee"), 
       count=c(1,1,2,1,2,3,1)) 

Я хотел бы решение dplyr, но я открыт для любых предложений! Точные элементы на платформе постоянно меняются, поэтому решение должно быть динамичным для учета этого.

ответ

7

Я считаю, что это должно дать вам то, что вы хотите

library(dplyr) 
OrderHistory %>% 
    group_by(customer, item) %>% 
    mutate(count = seq(n())) 

Source: local data frame [7 x 4] 
Groups: customer, item 

     date customer item count 
1 2015-02-01  A Candy  1 
2 2015-03-01  A Coffee  1 
3 2015-04-01  A Coffee  2 
4 2015-03-01  B Candy  1 
5 2015-04-01  B Candy  2 
6 2015-05-01  B Candy  3 
7 2015-05-01  B Coffee  1 
+0

Amazing. Такое элегантное простое решение. Благодаря! – SFuj

1

Вы получили свой «dplyr» ответ, но прямой путь в базовой R является использование ave:

ave(rep(1, nrow(OrderHistory)), OrderHistory[-1], FUN = seq_along) 
# [1] 1 1 2 1 2 3 1 

Вы можете также использовать getanID из моего пакета "splitstackshape":

library(splitstackshape) 
getanID(OrderHistory, c("customer", "item")) 
#   date customer item .id 
# 1: 2015-02-01  A Candy 1 
# 2: 2015-03-01  A Coffee 1 
# 3: 2015-04-01  A Coffee 2 
# 4: 2015-03-01  B Candy 1 
# 5: 2015-04-01  B Candy 2 
# 6: 2015-05-01  B Candy 3 
# 7: 2015-05-01  B Coffee 1 
Смежные вопросы