#r #fuzzyjoin
#r #fuzzyjoin
Вопрос:
Я пытаюсь выполнить исследование событий, которое оценивает, участвует ли конкретный человек в определенном событии (событие P) после прохождения определенного лечения (лечение E). Я делаю это, беря наблюдения события 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, а не все экземпляры события P для человека, который испытывает событие E), 2) Мне нужно сохранить наблюдения, в которых нет события P (индивидуум 3 / категория c испытывает событие E, но никогда не отслеживает событие P и вырезается из-за NA).
Какие-нибудь советы? Я уверен, что смогу решить проблему 2 с помощью дополнительного слияния, но попал в блок по проблеме 1.
Ответ №1:
Установка a max_dist=30
может помочь, если вы знаете, что самый ранний экземпляр всегда находится в пределах 30 дней. Или вы могли бы разбить свое событие E на 10 блоков, перебирать их с помощью fuzzy_left_join, а затем bind_rows впоследствии.