R 标识数据框中其他日期范围包含的用户内的日期范围
假设我有以下数据:R 标识数据框中其他日期范围包含的用户内的日期范围,r,dplyr,lubridate,R,Dplyr,Lubridate,假设我有以下数据: user_df = read.table(text = "start_date_proper end_date_proper id 1995-01-01 1997-12-31 1 1999-04-01 2000-06-30 1 2006-05-01 2009-08-31 1 2010-01-01 2011-12-31 1 2011-01-01 2011-12-31 1 2000-07-01 2020-12-31 1 2003-01-01 2020-12-31 1&q
user_df = read.table(text = "start_date_proper end_date_proper id
1995-01-01 1997-12-31 1
1999-04-01 2000-06-30 1
2006-05-01 2009-08-31 1
2010-01-01 2011-12-31 1
2011-01-01 2011-12-31 1
2000-07-01 2020-12-31 1
2003-01-01 2020-12-31 1", header = T)
多亏了这一点,我能够识别任何时候一行的结束日期和下一行的开始日期之间存在差距,并插入一个新行来填补这一差距。像这样:
user_df = user_df %>%
arrange(start_date_proper) %>%
group_by(id) %>%
mutate(nextstart = lead(start_date_proper)) %>%
filter(end_date_proper < nextstart) %>%
mutate(start_date_proper = end_date_proper, end_date_proper = nextstart, unemployed = 1L) %>%
select(-nextstart) %>%
bind_rows(mutate(user_df, unemployed = 0L)) %>%
arrange(id, start_date_proper) %>%
ungroup()
> user_df
# A tibble: 10 x 4
start_date_proper end_date_proper id unemployed
<chr> <chr> <int> <int>
1 1995-01-01 1997-12-31 1 0
2 1997-12-31 1999-04-01 1 1
3 1999-04-01 2000-06-30 1 0
4 2000-06-30 2000-07-01 1 1
5 2000-07-01 2020-12-31 1 0
6 2003-01-01 2020-12-31 1 0
7 2006-05-01 2009-08-31 1 0
8 2009-08-31 2010-01-01 1 1
9 2010-01-01 2011-12-31 1 0
10 2011-01-01 2011-12-31 1 0
user\u df=user\u df%>%
安排(开始日期正确)%>%
分组依据(id)%>%
变异(下一步开始=潜在客户(开始日期正确))%>%
过滤器(结束日期%
选择(-nextstart)%%>%
绑定_行(变异(用户_df,失业=0L))%>%
安排(id,开始日期)%>%
解组()
>用户_df
#一个tibble:10x4
开始日期正确结束日期正确id失业
1 1995-01-01 1997-12-31 1 0
2 1997-12-31 1999-04-01 1 1
3 1999-04-01 2000-06-30 1 0
4 2000-06-30 2000-07-01 1 1
5 2000-07-01 2020-12-31 1 0
6 2003-01-01 2020-12-31 1 0
7 2006-05-01 2009-08-31 1 0
8 2009-08-31 2010-01-01 1 1
9 2010-01-01 2011-12-31 1 0
10 2011-01-01 2011-12-31 1 0
但是,请注意,标识为待业的新行实际上并不准确,因为用户是从其他行中的一行工作的
所以问题是,有没有一种简单的方法来识别这些案例,并适当地设置
失业人员?我的第一个想法是遍历unember==1的每个日期,然后遍历用户内的所有其他日期,看看这些日期是否包含“unember==1”行所跨越的日期。但这需要进行很多比较,这对于我的大数据集来说是一个挑战。有什么想法吗?用
filter(end_date_proper < nextstart - 1) %>%
filter(结束日期)%
因为仅当下一段的起点比当前段的终点提前一天以上时,才需要添加间隙段
# A tibble: 9 x 4
start_date_proper end_date_proper id unemployed
<date> <date> <int> <int>
1 1995-01-01 1997-12-31 1 0
2 1997-12-31 1999-04-01 1 0
3 1999-04-01 2000-06-30 1 0
4 2000-07-01 2020-12-31 1 0
5 2003-01-01 2020-12-31 1 0
6 2006-05-01 2009-08-31 1 0
7 2009-08-31 2010-01-01 1 0
8 2010-01-01 2011-12-31 1 0
9 2011-01-01 2011-12-31 1 0
#一个tible:9 x 4
开始日期正确结束日期正确id失业
1 1995-01-01 1997-12-31 1 0
2 1997-12-31 1999-04-01 1 0
3 1999-04-01 2000-06-30 1 0
4 2000-07-01 2020-12-31 1 0
5 2003-01-01 2020-12-31 1 0
6 2006-05-01 2009-08-31 1 0
7 2009-08-31 2010-01-01 1 0
8 2010-01-01 2011-12-31 1 0
9 2011-01-01 2011-12-31 1 0
将滤清器管路更换为
filter(end_date_proper < nextstart - 1) %>%
filter(结束日期)%
因为仅当下一段的起点比当前段的终点提前一天以上时,才需要添加间隙段
# A tibble: 9 x 4
start_date_proper end_date_proper id unemployed
<date> <date> <int> <int>
1 1995-01-01 1997-12-31 1 0
2 1997-12-31 1999-04-01 1 0
3 1999-04-01 2000-06-30 1 0
4 2000-07-01 2020-12-31 1 0
5 2003-01-01 2020-12-31 1 0
6 2006-05-01 2009-08-31 1 0
7 2009-08-31 2010-01-01 1 0
8 2010-01-01 2011-12-31 1 0
9 2011-01-01 2011-12-31 1 0
#一个tible:9 x 4
开始日期正确结束日期正确id失业
1 1995-01-01 1997-12-31 1 0
2 1997-12-31 1999-04-01 1 0
3 1999-04-01 2000-06-30 1 0
4 2000-07-01 2020-12-31 1 0
5 2003-01-01 2020-12-31 1 0
6 2006-05-01 2009-08-31 1 0
7 2009-08-31 2010-01-01 1 0
8 2010-01-01 2011-12-31 1 0
9 2011-01-01 2011-12-31 1 0
我将以数据中的就业期内有失业期为前提工作。为了做到这一点,我将改变样本数据,使失业时期落在另一个时期。(这并不重要,但有助于演示和我的理解。)
user_df$start_date_property[4]%
安排(开始日期正确)%>%
变异(
开始日期正确=如果其他(
失业率>0,
pmax(开始日期正确,延迟(结束日期正确),na.rm=TRUE),
开始日期(正确),
结束日期正确=如果其他(
失业率>0,
pmin(结束日期正确,领导(开始日期正确),na.rm=TRUE),
结束日期(正确)
)
##tibble:10 x 4
#开始日期正确结束日期正确id失业
#
# 1 1995-01-01 1997-12-31 1 0
# 2 1997-12-31 1999-04-01 1 0
# 3 1999-04-01 2000-06-30 1 0
# 4 2000-07-01 2020-12-31 1 0
# 5 2003-01-01 2020-12-31 1 0
# 6 2020-12-31 2004-07-01 1 1
# 7 2006-05-01 2009-08-31 1 0
# 8 2009-08-31 2010-01-01 1 0
# 9 2010-01-01 2011-12-31 1 0
# 10 2011-01-01 2011-12-31 1 0
现在请注意,失业日期已更改为(1)在前一行结束之后,以及(2)在下一行开始之前。这显然是不可能的一行,因此应添加一个附加的过滤器:
过滤器(结束日期正确>=开始日期正确)
因此,完整代码(实际删除失业期)是:
user_df%>%
安排(开始日期正确)%>%
变异(
开始日期正确=如果其他(
失业率>0,
pmax(开始日期正确,延迟(结束日期正确),na.rm=TRUE),
开始日期(正确),
结束日期正确=如果其他(
失业率>0,
pmin(结束日期正确,领导(开始日期正确),na.rm=TRUE),
结束日期(正确)
) %>%
过滤器(结束日期正确>=开始日期正确)
在不完全重叠的情况下(只有一部分失业期是不正确的),这将使失业期缩短,因此