Как рассчитать количество различных значений, встречающихся на сегодняшний день в группе, используя dplyr - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть данные клиента, сгруппированные по идентификатору клиента и упорядоченные по дате покупки.Я хочу добавить столбец, который кумулятивно подсчитывает количество различных продуктов, которые были заказаны на сегодняшний день, то есть:

Input <- data.frame(Customer = c("C-01", "C-01", "C-02", "C-02", "C-02", "C-02", "C-03", "C-03", "C-03", "C-03"),
              Product = c("COKE", "COKE", "FRIES", "SHAKE", "BURGER", "BURGER", "CHICKEN", "FISH", "FISH", "FISH"),
              Date = c("2018-01-02","2018-01-05","2018-01-03","2018-01-06","2018-01-08","2018-01-12","2018-01-02","2018-01-04", "2018-01-16", "2018-01-20"))

Output <- data.frame(Customer = c("C-01", "C-01", "C-02", "C-02", "C-02", "C-02", "C-03", "C-03", "C-03", "C-03"),
                Product = c("COKE", "COKE", "FRIES", "SHAKE", "BURGER", "BURGER", "CHICKEN", "FISH", "FISH", "FISH"),
                Date = c("2018-01-02","2018-01-05","2018-01-03","2018-01-06","2018-01-08","2018-01-12","2018-01-02","2018-01-04", "2018-01-16", "2018-01-20"),
                Cum_Distinct = c(1, 1, 1, 2, 3, 3, 1, 2, 2, 2)) 

С набором входных данных я хочу создать выходные данные, используя dplyr.Как мне вести кумулятивный подсчет различных продуктов, встреченных на сегодняшний день?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Мы можем использовать match, чтобы получить индекс unique элементов 'Product'

library(dplyr)
Input %>% 
    group_by(Customer) %>%
    mutate(Cum_Distinct = match(Product, unique(Product)))
# A tibble: 10 x 4
# Groups:   Customer [3]
#   Customer Product Date       Cum_Distinct
#   <fct>    <fct>   <fct>             <int>
# 1 C-01     COKE    2018-01-02            1
# 2 C-01     COKE    2018-01-05            1
# 3 C-02     FRIES   2018-01-03            1
# 4 C-02     SHAKE   2018-01-06            2
# 5 C-02     BURGER  2018-01-08            3
# 6 C-02     BURGER  2018-01-12            3
# 7 C-03     CHICKEN 2018-01-02            1
# 8 C-03     FISH    2018-01-04            2
# 9 C-03     FISH    2018-01-16            2
#10 C-03     FISH    2018-01-20            2

Или используя group_indices

library(tidyverse)
Input %>%
     group_by(Customer) %>% 
     nest %>% 
     mutate(data = map(data, ~ .x %>%
            mutate(Cum_Distinct = group_indices(., Product)))) %>% 

unnest

Или используя base R

Input$Cum_Distinct <- with(Input, as.integer(ave(as.character(Product), Customer, 
                FUN = function(x) match(x, unique(x)))))
0 голосов
/ 04 февраля 2019

Мы могли бы взять кумулятивную сумму по не-1001 * значениям по группам.

library(dplyr)

Input %>%
  group_by(Customer) %>%
  mutate(Cum_Distinct = cumsum(!duplicated(Product)))


# Customer  Product Date       Cum_Distinct
#   <fct>    <fct>   <fct>      <int>
# 1 C-01     COKE    2018-01-02     1
# 2 C-01     COKE    2018-01-05     1
# 3 C-02     FRIES   2018-01-03     1
# 4 C-02     SHAKE   2018-01-06     2
# 5 C-02     BURGER  2018-01-08     3
# 6 C-02     BURGER  2018-01-12     3
# 7 C-03     CHICKEN 2018-01-02     1
# 8 C-03     FISH    2018-01-04     2
# 9 C-03     FISH    2018-01-16     2
#10 C-03     FISH    2018-01-20     2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...