1

我正在尝试执行一项事件研究,以评估特定个人在经历特定治疗(治疗 E)后是否参与特定事件(事件 P)。我通过观察事件 E 并尝试与事件 P 的观察合并来做到这一点,然后我将创建一个区间并对其进行评估,如下例所示:

library(tidyverse)
library(fuzzyjoin)

Event_E <- tibble::tribble(
  ~id, ~category,       ~date,
  1L,       "a",  "7/1/2000",
  2L,       "b", "11/1/2000",
  3L,       "c",  "7/1/2002"
) %>%
  mutate(date = as.Date(date, format = "%m/%d/%Y"))

Event_P <- tibble::tribble(
  ~category, ~other_info,     ~start,         ~end,
  "a",         "x", "7/30/2000", "12/31/2000",
  "b",         "y", "11/12/2000", "12/31/2001",
  "b",         "z", "8/1/2002", "12/31/2002"
) %>%
  mutate_at(vars(start, end), as.Date, format = "%m/%d/%Y")


fuzzy_left_join(
  Event_E, Event_P,
  by = c(
    "category" = "category",
    "date" = "start"
  ),
  match_fun = list(`==`, `<=`)
) %>%select(id, category = category.x, date,start)%>%
  group_by(category)%>%slice_min(start)%>%mutate(
  two_weeks=interval(start=date,end=date+weeks(2)),
  P_within=case_when(start%within%two_weeks~"Yes",TRUE~"No"))

这个过程很好,除了两个问题:1)我的实际数据太大以至于无法通过fuzzy_left_join()复制(我只需要相对于特定事件 E 的事件 P 的最快实例,而不是所有实例对于经历事件 E 的个人的事件 P),2)我需要保留没有事件 P 的观察(个人 3/类别 c 经历事件 E,但从不跟进事件 P,并且由于 NA 而被删除)。

有小费吗?我相信我可以通过额外的合并来解决问题 2,但在问题 1 上遇到了障碍。

4

1 回答 1

1

max_dist=30如果您知道最快的实例总是在 30 天内,则设置 a可能会有所帮助。或者你可以把你的事件 E 分成 10 个块,用fuzzy_left_join 循环它们,然后再用bind_rows。

于 2021-01-06T07:48:54.867 回答