检查给定用户内的连续行,并确定dplyr中另一列中的值何时更改

检查给定用户内的连续行,并确定dplyr中另一列中的值何时更改,r,dplyr,R,Dplyr,假设我有以下数据 user_df = read.table(text = "person_id job_number job_type start_date end_date 1 1 B 2012-11-01 2014-01-01 1 2 A 2016-02-01 2016-10-01 1 3 A 2016-12-01 2020-01-01 1

假设我有以下数据

user_df = read.table(text = "person_id job_number job_type start_date end_date
                  1 1 B 2012-11-01 2014-01-01
                  1 2 A 2016-02-01 2016-10-01
                  1 3 A 2016-12-01 2020-01-01
                  1 4 B 2020-01-01 2021-01-01
                  2 1 A 2011-03-01 2012-08-01
                  2 2 B 2013-01-01 2020-01-01
                  2 3 A 2020-01-01 2021-01-01
                  2 4 B 2021-01-01 2021-01-17
                  3 1 A 2005-03-01 2011-03-01
                  3 2 B 2012-01-01 2014-01-01", header = T)
每个
person\u id
将具有数量可变的作业,这些作业可以具有多种类型中的一种(在此数据集中,作业仅具有类型
a
B

我想添加一列
开关
,如果当前行中的
作业类型
列是
a
,前一列是
B
,则该列设置为1。否则,该值为0。因此,如果当前行是作业类型
B
或当前行是作业类型
a
,且前一行是顶行也是作业类型
A

最终df如下所示:

user_df = read.table(text = "person_id job_number job_type start_date end_date switch
                      1 1 B 2012-11-01 2014-01-01 0
                      1 2 A 2016-02-01 2016-10-01 1
                      1 3 A 2016-12-01 2020-01-01 0
                      1 4 B 2020-01-01 2021-01-01 0
                      2 1 A 2011-03-01 2012-08-01 1
                      2 2 B 2013-01-01 2020-01-01 0
                      2 3 A 2020-01-01 2021-01-01 1
                      2 4 B 2021-01-01 2021-01-17 0
                      3 1 A 2005-03-01 2011-03-01 1
                      3 2 B 2012-01-01 2014-01-01 0", header = T)

我知道解决方案将涉及
dplyr
库中的
lag
,但我不确定如何将其用于此目的。

一种可能的方法是将
job\u type==“A”
视为一个数值,然后应用
diff
函数来测量变化

tidyverse
版本:

库(dplyr)
用户_df%>%
分组人(个人id)%>%
变异(开关=c(0,差异(作业类型=A)),
开关=ifelse(开关=1,1,0))
数据表
版本:

库(data.table)
user_dt=数据表(user_df)
用户[u dt],开关:=c(0,差异(作业类型==“A”)),用户=(人员id)][
,开关:=ifelse(开关==1,1,0)]
用户数据
人员id作业编号作业类型开始日期结束日期开关
1:11B 2012-11-01 2014-01-01 0
2:12 A 2016-02-01 2016-10-01 1
3:13A 2016-12-01 2020-01-01 0
4:14B2020-01-012021-01-010
5:21A 2011-03-01 2012-08-01 0
6:22B2013-01-012020-01-010
7:23A2020-01-01 2021-01-01 1
8:24 B 2021-01-01 2021-01-17 0
9:31 A 2005-03-01 2011-03-01 0
10:32 B 2012-01-01 2014-01-01 0

显然,两个版本都可以在一个步骤中执行,但我认为这样做的想法更清晰。

实际上非常聪明。一点都不是黑客!