使用 dplyr 计算 R 中的分组序列

如何解决使用 dplyr 计算 R 中的分组序列

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

sample_data <- data.frame(customer_id = c(1000,1000,2000,3000,4000,4000),activity_date = as.Date(c("2020-01-01","2020-01-01","2020-02-29","2020-03-01","2020-01-02","2020-03-04","2020-05-22","2020-03-05","2020-06-01"),format = "%Y-%m-%d"),activity = c("like","purchase","like","visit","email","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,"email"),general_sequence = c(1,1,2,3,2),rule_sequence = c(1,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 年 5 月 11 日创建

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?