Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查组中的任何日期是否在r中该组的特定时间间隔内_R_Dplyr_Lubridate - Fatal编程技术网

检查组中的任何日期是否在r中该组的特定时间间隔内

检查组中的任何日期是否在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)%>% 我的答案并不像我想的那么“漂亮”,但它能帮你找到你

我想创建一个新变量,用于指示就诊日期是否在id列出的任何日期范围内

我使用了这段代码来逐行比较,但我想扩展它,并将id的所有行与该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]