Если я правильно понимаю,
codes
содержит шаги процедуры, которые были применены к пациенту. Одна строка в codes
относится к одному пациенту. proce
содержит этапы процедуры, которые составляют специальную процедуру .
ОП хочет определить, какие специальные процедуры были применены к каждому пациенту (если есть). Таким образом, специальная процедура считается примененной к пациенту только в том случае, если все его этапов процедуры применены.
Для решения этой проблемы я предлагаю изменить все данные в аккуратный формат , т. е. сначала в длинном формате.
Затем мы можем присоединиться к этапам процедуры, отфильтровать для завершить специальные процедуры и объединить, чтобы получить одно на пациента:
lc <- codes[, cid := .I][, .(step = unlist(a1)), by = cid]
lp <- melt(proce[, pid := .I], "pid", na.rm = TRUE, value.name = "step")[
, n_steps := .N, by = pid][]
lp[lc, on = .(step)][
, .N == first(n_steps), by = .(cid, pid)][
(V1), .(pid = toString(sort(pid))), by = cid]
cid pid
1: 1 2
2: 2 3, 4
Обратите внимание, что pid
показаны в сжатой форме только для демонстрации; также доступны другие форматы вывода в зависимости от последующих этапов обработки.
Если требуется показать всех пациентов, даже если они не получили специальной процедуры:
lp[lc, on = .(step)][, .N == first(n_steps), by = .(cid, pid)][
V1 | is.na(V1), .(pid = toString(sort(pid))), by = cid]
cid pid
1: 1 2
2: 2 3, 4
3: 3
Код комментария
# reshape data to long format, thereby adding a row number to identify patients
lc <- codes[, cid := .I][, .(step = unlist(a1)), by = cid]
# reshape data to long format, thereby adding a row number to identify special procdures
lp <- melt(proce[, pid := .I], "pid", na.rm = TRUE, value.name = "step")[
# count the number of procedure steps which constitute a special procedure
, n_steps := .N, by = pid][]
# join on procedure steps
lp[lc, on = .(step)][
# group by patient and special procedure and test for completeness of steps
, .N == first(n_steps), by = .(cid, pid)][
# filter for complete special procedures and aggregate to get one row per patient
(V1), .(pid = toString(sort(pid))), by = cid]
После изменения формы lc
равен
cid step
1: 1 o721
2: 1 10d07z6
3: 1 3e033vj
4: 2 z370
5: 2 0uqg0zz
6: 2 0tqd7zz
7: 2 o701
8: 3 o09513
9: 3 o721
10: 3 o701
11: 3 z370
12: 3 0uqg8zz
и lp
равен
pid variable step n_steps
1: 1 v1 o09513 3
2: 2 v1 o721 3
3: 3 v1 o701 2
4: 4 v1 z370 2
5: 1 v2 0w8nxzz 3
6: 2 v2 10d07z6 3
7: 3 v2 0tqd7zz 2
8: 4 v2 0uqg0zz 2
9: 1 v3 3e030vj 3
10: 2 v3 3e033vj 3