根据标准从当前观察开始总结

Sum up ending with the current observation starting based on a criteria

我观察了(在下面的示例中:4)不同客户在(五)天不同的购买次数。现在我想创建一个新变量,总结每个用户在过去 20 次购买中所有用户的购买次数。

示例数据:

> da <- data.frame(customer_id = c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4),
+                  day = c("2016-04-11","2016-04-12","2016-04-13","2016-04-14","2016-04-15","2016-04-11","2016-04-12","2016-04-13","2016-04-14","2016-04-15","2016-04-11","2016-04-12","2016-04-13","2016-04-14","2016-04-15","2016-04-11","2016-04-12","2016-04-13","2016-04-14","2016-04-15"),
+                  n_purchase = c(5,2,8,0,3,2,0,3,4,0,2,4,5,1,0,2,3,5,0,3))
> da
   customer_id        day n_purchase
1            1 2016-04-11          5
2            1 2016-04-12          2
3            1 2016-04-13          8
4            1 2016-04-14          0
5            1 2016-04-15          3
6            2 2016-04-11          2
7            2 2016-04-12          0
8            2 2016-04-13          3
9            2 2016-04-14          4
10           2 2016-04-15          0
11           3 2016-04-11          2
12           3 2016-04-12          4
13           3 2016-04-13          5
14           3 2016-04-14          1
15           3 2016-04-15          0
16           4 2016-04-11          2
17           4 2016-04-12          3
18           4 2016-04-13          5
19           4 2016-04-14          0
20           4 2016-04-15          3

我需要知道三件事来构造我的变量: (1) 用户一天的总购买量(日购买量)是多少? (2) 从第一天(cumsum_day_purchases)开始,用户累计购买次数是多少? (3) 根据当前观察,前 20 次(跨用户)购买是从哪一天开始的?这是我在编写此类变量时遇到问题的地方。

> library(dplyr)
> da %>% 
+   group_by(day) %>% 
+   mutate(day_purchases = sum(n_purchase)) %>% 
+   group_by(customer_id) %>%
+   mutate(cumsum_day_purchases = cumsum(day_purchases))
# A tibble: 20 x 5
# Groups:   customer_id [4]
   customer_id day        n_purchase day_purchases cumsum_day_purchases
         <dbl> <fct>           <dbl>         <dbl>                <dbl>
 1           1 2016-04-11          5            11                   11
 2           1 2016-04-12          2             9                   20
 3           1 2016-04-13          8            21                   41
 4           1 2016-04-14          0             5                   46
 5           1 2016-04-15          3             6                   52
 6           2 2016-04-11          2            11                   11
 7           2 2016-04-12          0             9                   20
 8           2 2016-04-13          3            21                   41
 9           2 2016-04-14          4             5                   46
10           2 2016-04-15          0             6                   52
11           3 2016-04-11          2            11                   11
12           3 2016-04-12          4             9                   20
13           3 2016-04-13          5            21                   41
14           3 2016-04-14          1             5                   46
15           3 2016-04-15          0             6                   52
16           4 2016-04-11          2            11                   11
17           4 2016-04-12          3             9                   20
18           4 2016-04-13          5            21                   41
19           4 2016-04-14          0             5                   46
20           4 2016-04-15          3             6                   52

我现在将在以下数据集中手动计算我希望拥有的变量。

导致以下输出:

> da = da %>% ungroup() %>%
+   mutate(cumsum_last_20_purchases = c(5,5+2,8,0,0+3,2,2+0,3,4,4+0,2,2+4,5,1,1+0,2,2+3,5,0,0+3))
> da
# A tibble: 20 x 6
   customer_id day        n_purchase day_purchases cumsum_day_purchases cumsum_last_20_purchases
         <dbl> <fct>           <dbl>         <dbl>                <dbl>                    <dbl>
 1           1 2016-04-11          5            11                   11                        5
 2           1 2016-04-12          2             9                   20                        7
 3           1 2016-04-13          8            21                   41                        8
 4           1 2016-04-14          0             5                   46                        0
 5           1 2016-04-15          3             6                   52                        3
 6           2 2016-04-11          2            11                   11                        2
 7           2 2016-04-12          0             9                   20                        2
 8           2 2016-04-13          3            21                   41                        3
 9           2 2016-04-14          4             5                   46                        4
10           2 2016-04-15          0             6                   52                        4
11           3 2016-04-11          2            11                   11                        2
12           3 2016-04-12          4             9                   20                        6
13           3 2016-04-13          5            21                   41                        5
14           3 2016-04-14          1             5                   46                        1
15           3 2016-04-15          0             6                   52                        1
16           4 2016-04-11          2            11                   11                        2
17           4 2016-04-12          3             9                   20                        5
18           4 2016-04-13          5            21                   41                        5
19           4 2016-04-14          0             5                   46                        0
20           4 2016-04-15          3             6                   52                        3

我们可以根据 day_purchase 列超过 20 的最后一天创建一个新分组,然后在该日期上使用 cumsum

library(dplyr)

da %>% 
  group_by(day) %>% 
  mutate(day_purchases = sum(n_purchase)) %>% 
  group_by(customer_id) %>% 
  mutate(above = with(rle(day_purchases >= 20), rep(1:length(lengths), lengths))) %>% 
  group_by(above, .add  =TRUE) %>% 
  mutate(cumsum_last_20_purchases = cumsum(n_purchase))
#> # A tibble: 20 x 6
#> # Groups:   customer_id, above [12]
#>    customer_id day        n_purchase day_purchases above cumsum_last_20_purchas…
#>          <dbl> <fct>           <dbl>         <dbl> <int>                   <dbl>
#>  1           1 2016-04-11          5            11     1                       5
#>  2           1 2016-04-12          2             9     1                       7
#>  3           1 2016-04-13          8            21     2                       8
#>  4           1 2016-04-14          0             5     3                       0
#>  5           1 2016-04-15          3             6     3                       3
#>  6           2 2016-04-11          2            11     1                       2
#>  7           2 2016-04-12          0             9     1                       2
#>  8           2 2016-04-13          3            21     2                       3
#>  9           2 2016-04-14          4             5     3                       4
#> 10           2 2016-04-15          0             6     3                       4
#> 11           3 2016-04-11          2            11     1                       2
#> 12           3 2016-04-12          4             9     1                       6
#> 13           3 2016-04-13          5            21     2                       5
#> 14           3 2016-04-14          1             5     3                       1
#> 15           3 2016-04-15          0             6     3                       1
#> 16           4 2016-04-11          2            11     1                       2
#> 17           4 2016-04-12          3             9     1                       5
#> 18           4 2016-04-13          5            21     2                       5
#> 19           4 2016-04-14          0             5     3                       0
#> 20           4 2016-04-15          3             6     3                       3

reprex package (v0.3.0)

于 2020-07-28 创建