检查给定用户内的连续行,并确定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
显然,两个版本都可以在一个步骤中执行,但我认为这样做的想法更清晰。实际上非常聪明。一点都不是黑客!