我有一个df,其中我需要计算一长串可能事件中两种类型事件之间的天数,例如,对于给定的唯一id,过量服用"a_type_event"和临床会话"C_type_event",其中事件a总是在事件C:之前
df<- tribble(
~ unique_id, ~event_type, ~ event_date,
'id_101', 'A_type_event', '2022-01-01',
'id_101', 'B_type_event', '2022-02-01',
'id_101', 'A_type_event', '2022-02-15',
'id_101', 'A_type_event', '2022-02-28',
'id_101', 'B_type_event', '2022-03-01',
'id_101', 'C_type_event', '2022-03-10',
'id_101', 'A_type_event', '2022-03-20',
'id_101', 'C_type_event', '2022-04-01'
)
实际的df有20多种事件类型,我需要根据字符串进行筛选(例如,包含"a_type"(。如何计算每个"A_type_event"和下一个由唯一id分组的"C_type_events"之间的天数?
所需输出为:
df2<- tribble(
~ unique_id, ~event_type_A, ~ event_date_A, ~event_type_C, ~event_date_C, ~days_between
'id_101', 'A_type_event', '2022-01-01','C_type_event', '2022-03-10',68
)
使用dplyr的开发版本(目前为v1.0.99.9000(,我们可以进行非equi连接,以获得未来的第一个匹配:
编辑新数据和规范
#devtools::install_github("tidyverse/dplyr")
library(dplyr)
left_join(
df %>% filter(event_type == "A_type_event"), # match A_type_event
df %>% filter(event_type == "C_type_event"), # with C_type_event
#join_by(event_date < event_date), # where A_type_event before C_type_event
join_by(unique_id, event_date < event_date), # ... and unique id matches
multiple = "first") # and just keep first match
# A tibble: 4 × 5
unique_id event_type.x event_date.x event_type.y event_date.y
<chr> <chr> <chr> <chr> <chr>
1 id_101 A_type_event 2022-01-01 C_type_event 2022-03-10
2 id_101 A_type_event 2022-02-15 C_type_event 2022-03-10
3 id_101 A_type_event 2022-02-28 C_type_event 2022-03-10
4 id_101 A_type_event 2022-03-20 C_type_event 2022-04-01