限制模糊连接计算
Limiting fuzzy join calculations
我正在尝试执行一项事件研究,评估特定个体在经历特定治疗(治疗 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()
进行复制(我只需要事件 P 的最快实例相对于特定事件 E,不是经历事件 E 的个人的所有事件 P 实例),2) 我需要保留没有事件 P 的观察(个人 3/类别 c 经历事件 E,但从不跟进事件P,由于 NA 而被删掉)。
有什么建议吗?我有信心我可以通过额外的合并解决问题 2,但在问题 1 上遇到了障碍。
如果您知道最快的时间总是在 30 天内,那么设置 max_dist=30
可能会有所帮助。或者您可以将事件 E 分成 10 个块,用 fuzzy_left_join 循环遍历它们,然后 bind_rows 之后。
我正在尝试执行一项事件研究,评估特定个体在经历特定治疗(治疗 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()
进行复制(我只需要事件 P 的最快实例相对于特定事件 E,不是经历事件 E 的个人的所有事件 P 实例),2) 我需要保留没有事件 P 的观察(个人 3/类别 c 经历事件 E,但从不跟进事件P,由于 NA 而被删掉)。
有什么建议吗?我有信心我可以通过额外的合并解决问题 2,但在问题 1 上遇到了障碍。
如果您知道最快的时间总是在 30 天内,那么设置 max_dist=30
可能会有所帮助。或者您可以将事件 E 分成 10 个块,用 fuzzy_left_join 循环遍历它们,然后 bind_rows 之后。