У меня есть данные о поступлении и выписке из нескольких клиник, и мне необходимо определить, есть ли совпадения при поступлении между 2+ пациентами в одном клинике c с одним и тем же штаммом ДНК возбудителя. Работа в R.
Только 5 переменных: идентификатор исследования, дата начала, дата окончания, штамм ДНК и клини c. Каждый ряд представляет собой отдельное посещение, что означает переменная «ID» может повторяться. Мне нужно определить, сколько было «перекрытий», то есть пациентов с одинаковой ДНК-патогеном находились в одном клинике c в в то же время.
Это (на первый взгляд) простой вопрос, который широко обсуждается на этом сайте. Я могу определить совпадения, когда каждый идентификатор уникален. Моя конкретная проблема c заключается в том, как бороться с повторяющимися идентификаторами. В приведенном ниже коде я предоставляю примеры данных и мой код, который работает, когда каждый идентификатор уникален (это можно быстро проверить, изменив seq(1:20)),each=2)
на seq(1:40)),each=1)
в первой строке кода). Если я запускаю этот код с повторяющимися идентификаторами, он помечает все посещения как перекрывающиеся = 1 для идентификатора с любыми перекрытиями, независимо от того, перекрывалось ли это фактическое посещение.
Я знаю, что перекрывающиеся интервалы дат - это топ c большого количества обсуждений, поэтому, пожалуйста, поверьте, что я тщательно изучил все, что мог найти, и почти сделал это за исключением этой последней части. Любой совет очень ценится.
Спасибо!
#Set globals
set.seed(8126)
library(lubridate); library(data.table)
#Example Data
have<-data.frame(rep(paste0("k",seq(1:20)),each=2),sample(seq(as.Date('2015/01/01'), as.Date('2020/01/01'), by="day"), 40))
names(have)<-c("id","datein")
have$dateout<-have$datein+40 #arbitrarily add 40 days to admission date
have$dnastrain<-as.vector(replicate(20,rep(sample(c("Type 1","Type 2","Type 3"),1),each=2)))
have$clinic<-sample(c("A","B","C","D"),40, replace=TRUE)
#Code that works if each ID is unique
setDT(have); setkey(have,datein, dateout) #Convert to DT and set date in/out as keys
overlaps<-unique(foverlaps(have, have)[id!=i.id & dnastrain==i.dnastrain & clinic==i.clinic, id]) #find overlaps
have[,`:=`(overlap=0)][id %in% overlaps, overlap:=1][order(datein)] #Identify overlaps