【问题标题】:Sum up ending with the current observation starting based on a criteria总结以基于标准开始的当前观察结果
【发布时间】:2020-07-27 16:36:23
【问题描述】:

我观察了(在下面的示例中: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

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

  • 对于 2016-04-12 日的所有观察,我计算累积和 通过添加购买数量来购买特定客户的购买次数 当天和前一天,因为总共所有 客户在当天一共购买了 20 笔商品, 前一天。
  • 对于 2016-04-13 天,我只使用用户的购买次数 这一天,因为当天有 21 (41-20) 次新购买

导致以下输出:

> 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

【问题讨论】:

  • 不清楚预期。您的代码符合预期?
  • 最后的输出包括预期的。我正在寻找我刚刚手动添加的变量“cumsum_last_20_purchases”。
  • 你能解释一下那个专栏背后的逻辑吗?
  • 我添加了更多信息,希望它有助于理解我的目标。但是,如果没有,我明天会花更多时间把它说得更清楚。

标签: r dplyr sum pipe cumsum


【解决方案1】:

我们可以根据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 年 7 月 28 日创建

【讨论】:

  • 很好的解决方案,谢谢!很高兴你清楚我打算做什么。
猜你喜欢
  • 1970-01-01
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
  • 1970-01-01
相关资源
最近更新 更多