检查组中的任何日期是否在r中该组的特定时间间隔内
我想创建一个新变量,用于指示就诊日期是否在id列出的任何日期范围内 我使用了这段代码来逐行比较,但我想扩展它,并将id的所有行与该id列出的所有间隔行进行比较检查组中的任何日期是否在r中该组的特定时间间隔内,r,dplyr,lubridate,R,Dplyr,Lubridate,我想创建一个新变量,用于指示就诊日期是否在id列出的任何日期范围内 我使用了这段代码来逐行比较,但我想扩展它,并将id的所有行与该id列出的所有间隔行进行比较 df <- df %>% group_by(id) %>% mutate(between_any = ifelse((visit_date >= start & visit_date <= end), 1)) df% 分组依据(id)%>% 我的答案并不像我想的那么“漂亮”,但它能帮你找到你
df <- df %>%
group_by(id) %>%
mutate(between_any = ifelse((visit_date >= start & visit_date <= end), 1))
df%
分组依据(id)%>%
我的答案并不像我想的那么“漂亮”,但它能帮你找到你想要去的地方
我首先将您的日期转换为日期:
库(lubridate)
图书馆(dplyr)
图书馆(tibble)
图书馆(tidyr)
图书馆(purrr)
df%
在(-1,截止日期)处进行变异
>df
id访问日期开始结束
1A 2001-08-22
2 a 2001-09-212001-09-212001-11-01
3 a 2001-10-30
4 a 2001-11-10 2001-11-10 2001-11-10
5 a 2001-12-20
6b 2002-12-22 2002-12-22 2002-12-22
7 b 2003-04-30 2003-04-30 2003-06-01
8B 2003-05-10
接下来,我为每个组创建一个间隔列表:
df\u间隔%
在(-1,截止日期)%>%处突变
过滤器(!is.na(开始),
!is.na(end))%>%
变异(间隔=开始%-%end)%%>%
选择(id,间隔)%>%
分组人(id)
>df_间隔
#一个tibble:4x2
#组别:id[2]
id间隔
世界协调时2001-09-21--2001-11-01
2 2001-11-10协调世界时--2001-11-10协调世界时
3 b 2002-12-22 UTC--2002-12-22 UTC
4 b 2003-04-30 UTC--2003-06-01 UTC
最后,我根据id
将间隔数据连接到原始数据,并在间隔内搜索visit\u date
df_输出%as.tbl()%%>%
内部连接(df\U间隔)%>%
变异(在任意=map2 lgl(就诊日期、间隔,~.x>=int\u开始(.y)和.x%之间)
分组人(id、就诊日期、开始、结束)%>%
总结(在任意之间=作为.numeric(任意(在任意之间)))
>df_输出
#一个tibble:8x5
#组:id,访问日期,开始[8]
id访问\u日期开始结束\u任何
1a 2001-08-22不适用0
2 a 2001-09-212001-09-212001-11-01 1
3 a 2001-10-30不适用1
4 a 2001-11-10 2001-11-10 2001-11-10 2001-11-10 1
5 a 2001-12-20 NA 0
6b 2002-12-22 2002-12-22 2002-12-22 1
7 b 2003-04-30 2003-04-30 2003-06-01 1
8B 2003-05-10NA 1
另一种可能是:
df %>%
rowid_to_column() %>%
full_join(df %>%
filter(!is.na(start) & !is.na(end)) %>%
mutate(interval = interval(ymd(start), ymd(end))) %>%
select(id, interval), by = c("id" = "id")) %>%
group_by(rowid, id) %>%
summarise(between_any = max(ymd(visit_date) %within% interval * 1)) %>%
left_join(df %>%
rowid_to_column(), by = c("rowid" = "rowid",
"id" = "id")) %>%
ungroup() %>%
select(-rowid)
id between_any visit_date start end
<fct> <dbl> <fct> <fct> <fct>
1 a 0 2001-11-08 <NA> <NA>
2 a 1 2001-09-21 2001-09-21 2001-11-01
3 a 1 2001-10-30 <NA> <NA>
4 a 1 2001-11-10 2001-11-10 2001-11-10
5 a 0 2001-12-20 <NA> <NA>
6 b 1 2002-12-22 2002-12-22 2002-12-22
7 b 1 2003-04-30 2003-04-30 2003-06-01
8 b 1 2003-05-10 <NA> <NA>
df%>%
rowid_到_列()%>%
完全联接(df%>%
过滤器(!is.na(开始)和!is.na(结束))%>%
变异(间隔=间隔(ymd(开始),ymd(结束))%>%
选择(id,间隔),按=c(“id”=“id”))%>%
分组依据(rowid,id)%>%
总结(在%interval*1范围内,在%any=max(ymd(就诊日期)%)之间)%>%
左联合(df%>%
rowid_to_column(),by=c(“rowid”=“rowid”,
“id”=“id”))%>%
解组()%>%
选择(-rowid)
任何就诊日期开始和结束之间的id
1A 0 2001-11-08
212001-09-212001-09-212001-11-01
3 a 1 2001-10-30
4 a 1 2001-11-10 2001-11-10 2001-11-10 2001-11-10
5 a 0 2001-12-20
6b12002-12-222002-12-222002-12-222002-12-22
7 b 1 2003-04-30 2003-04-30 2003-06-01
8 b 1 2003-05-10
在这里,它首先创建间隔变量,然后根据“id”执行完全联接。其次,它检查“访问日期”是否在每个“id”和“rowid”的任何间隔内。最后,它将结果与原始数据联接。数据包中的
函数中的
表正是这样做的
library(data.table)
df <- df %>%
group_by(id) %>%
mutate(between_any = as.numeric((inrange(visit_date, start, end))))
#> df
# id visit_date start end between_any
#1 a 2001-08-22 <NA> <NA> 0
#2 a 2001-09-21 2001-09-21 2001-11-01 1
#3 a 2001-10-30 <NA> <NA> 1
#4 a 2001-11-10 2001-11-10 2001-11-10 1
#5 a 2001-12-20 <NA> <NA> 0
#6 b 2002-12-22 2002-12-22 2002-12-22 1
#7 b 2003-04-30 2003-04-30 2003-06-01 1
#8 b 2003-05-10 <NA> <NA> 1
库(data.table)
df%
分组依据(id)%>%
变异(在任意=数值((范围(访问日期、开始、结束))之间)
#>df
#id访问\u日期开始结束\u任何
#1A 2001-08-22 0
#2 a 2001-09-212001-09-212001-11-01 1
#3 a 2001-10-30 1
#4 a 2001-11-10 2001-11-10 2001-11-10 2001-11-10 1
#5 a 2001-12-20 0
#6b 2002-12-22 2002-12-22 2002-12-22 1
#7 b 2003-04-30 2003-04-30 2003-06-01 1
#8 b 2003-05-10 1
在data.table格式中
dt <- setDT(df)
dt[, between_any := inrange(visit_date, start, end),
by = id]
dt@Wil感谢您的关注,更新了帖子:)这太完美了!我在我的任何研究中都没有遇到过这种情况。非常感谢您。谢谢@Wil的帮助!
library(data.table)
df <- df %>%
group_by(id) %>%
mutate(between_any = as.numeric((inrange(visit_date, start, end))))
#> df
# id visit_date start end between_any
#1 a 2001-08-22 <NA> <NA> 0
#2 a 2001-09-21 2001-09-21 2001-11-01 1
#3 a 2001-10-30 <NA> <NA> 1
#4 a 2001-11-10 2001-11-10 2001-11-10 1
#5 a 2001-12-20 <NA> <NA> 0
#6 b 2002-12-22 2002-12-22 2002-12-22 1
#7 b 2003-04-30 2003-04-30 2003-06-01 1
#8 b 2003-05-10 <NA> <NA> 1
dt <- setDT(df)
dt[, between_any := inrange(visit_date, start, end),
by = id]