【问题标题】:Calculating grouped sequences in R with dplyr使用 dplyr 计算 R 中的分组序列
【发布时间】:2021-05-11 08:53:37
【问题描述】:

我正在使用类似于我在下面创建的示例的数据集,其中记录了每个客户的活动:

sample_data <- data.frame(customer_id = c(1000, 1000,1000, 1000,1000, 1000, 2000, 3000,3000,3000, 4000,4000),
           activity_date = as.Date(c("2020-01-01", "2020-01-01", "2020-01-01", "2020-01-01", "2020-02-29", "2020-03-01", "2020-01-02", "2020-01-01", "2020-03-04", "2020-05-22", "2020-03-05", "2020-06-01"), format = "%Y-%m-%d"),
           activity = c("like", "purchase", "like", "visit", "email", "like", "purchase", "visit", "purchase", "visit", "like", "email"))

对于我的最终数据集,我想在数据中添加两列计算出的“序列”,其中每一列表示不同类型的序列。

  1. 一般顺序:按customer_id 级别分组,每条规则应连续计数。但是,发生在同一日期的规则也应该表明相同的顺序,这意味着只有在日期发生变化时才会继续计数。
  2. 规则序列:按customer_id 级别分组,每个单独的规则应从序列 1 开始并继续基于规则计数,具体取决于特定规则在每个客户中出现的频率。同样,发生在同一日期的规则应指示相同的顺序。

到目前为止,我已经想出了以下dplyr 代码,它有两个问题:

test_result <- sample_data  %>%
  dplyr::group_by(customer_id) %>% 
  dplyr::arrange(activity_date) %>% 
  dplyr::mutate(general_sequence=1:n()) %>% dplyr::ungroup()
  • 在同一日期跟踪的规则没有相同的顺序。正如您在 test_result 中看到的那样,计数从 1 开始并继续计数,即使在同一天跟踪了规则。
  • 我根本没有计算出“规则序列”列。我假设我需要应用不同的分组才能获得结果(可能基于“规则”?)

为了更清楚起见,我创建了一个表格,显示我希望最终结果的样子:

final_data <- data.frame(customer_id = c(1000, 1000,1000, 1000,1000, 1000, 2000, 3000,3000,3000, 4000,4000),
                         activity_date = as.Date(c("2020-01-01", "2020-01-01", "2020-01-01", "2020-01-01", "2020-02-29", "2020-03-01", "2020-01-02", "2020-01-01", "2020-03-04", "2020-05-22", "2020-03-05", "2020-06-01"), format = "%Y-%m-%d"),
                         activity = c("like", "purchase", "like", "visit", "purchase", "like", "purchase", "visit", "purchase", "visit", "like", "email"),
                         general_sequence = c(1, 1, 1, 1, 2, 3, 1, 1, 2, 3, 1, 2),
                         rule_sequence = c(1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1))

非常感谢任何帮助!谢谢!

【问题讨论】:

  • 你的sample_datafinal_data 没有相同的activity 列,rule_sequance 在同一日期更改相同活动的值,这是你说你不想要的?
  • 你能解释一下你的规则顺序吗?我没明白。 continue counting on a rule-basis, depending on how often the specific rule appears per customer 中的规则是什么?

标签: r dataframe date dplyr sequence


【解决方案1】:

这是使用 {dplyr} 和 data.table::rleid 的一种方法:

library(dplyr)

sample_data %>% 
  group_by(customer_id) %>%
  mutate(general_sequence = data.table::rleid(activity_date)) %>% 
  group_by(customer_id, activity) %>%
  mutate(rule_sequence = row_number())

#> # A tibble: 12 x 5
#> # Groups:   customer_id, activity [9]
#>    customer_id activity_date activity general_sequence rule_sequence
#>          <dbl> <date>        <chr>               <int>         <int>
#>  1        1000 2020-01-01    like                    1             1
#>  2        1000 2020-01-01    purchase                1             1
#>  3        1000 2020-01-01    like                    1             2
#>  4        1000 2020-01-01    visit                   1             1
#>  5        1000 2020-02-29    email                   2             1
#>  6        1000 2020-03-01    like                    3             3
#>  7        2000 2020-01-02    purchase                1             1
#>  8        3000 2020-01-01    visit                   1             1
#>  9        3000 2020-03-04    purchase                2             1
#> 10        3000 2020-05-22    visit                   3             2
#> 11        4000 2020-03-05    like                    1             1
#> 12        4000 2020-06-01    email                   2             1

reprex package (v0.3.0) 于 2021-05-11 创建

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-02
    • 2018-06-20
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多