如何计算使用dplyr一组遇到的日期不同值的数量

问题描述 投票:0回答:2

我有客户ID的客户数据进行分组,并通过购买日期排序。我想补充一点,累积计数已下令日期不同的产品数量列 - 即:

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创建输出数据。如何保持遇到的日期不同产品的累积计数?

r dplyr
2个回答
1
投票

我们可以通过组接管非duplicated值累计总和。

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

0
投票

我们可以用match获得“产品”的unique元素的索引

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)))))
© www.soinside.com 2019 - 2024. All rights reserved.