У меня есть данные, где я рассчитываю эпизоды медицинской помощи (например, посещения ER). Хитрость в том, что я не могу сосчитать каждое посещение, потому что иногда второе или третье посещение фактически является продолжением предыдущей проблемы. Поэтому мне дали указание подсчитать посещения с использованием 30-дневного «чистого периода» или «периода полного отключения», чтобы я искал первое событие (ПОСЕЩЕНИЕ 1) по пациенту (минимальная дата), я считаю это событие , затем примените правила, чтобы НЕ считать количество посещений, которые произошли в течение 30 дней после первого события. По истечении этого 30-дневного окна я могу начать поиск 2-го посещения (ПОСЕЩЕНИЕ 2), подсчитать его, затем снова применить 30-дневное затемнение (НЕ считая посещений, которые происходят в течение 30 дней после посещения № 2). .. стирать, полоскать, повторять ...
Я собрал очень неаккуратное решение, которое требует большой няни и ручной проверки шагов (см. Ниже). Я должен верить, что есть лучший способ. ПОМОГИТЕ!
data1 <- structure(list(ID = structure(c(2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L,
3L, 4L, 4L, 4L, 4L, 4L), .Label = c("", "patient1", "patient2",
"patient3"), class = "factor"), Date = structure(c(14610, 14610,
14627, 14680, 14652, 14660, 14725, 15085, 15086, 14642, 14669,
14732, 14747, 14749), class = "Date"), test = c(1L, 1L, 1L, 2L,
1L, 1L, 2L, 3L, 3L, 1L, 1L, 2L, 2L, 2L)), .Names = c("ID", "Date",
"test"), class = "data.frame", row.names = c(NA, 14L))
library(doBy)
## create a table of first events
step1 <- summaryBy(Date~ID, data = data1, FUN=min)
step1$Date30 <- step1$Date.min+30
step2 <- merge(data1, step1, by.x="ID", by.y="ID")
## use an ifelse to essentially remove any events that shouldn't be counted
step2$event <- ifelse(as.numeric(step2$Date) >= step2$Date.min & as.numeric(step2$Date) <= step2$Date30, 0, 1)
## basically repeat steps above until I dont capture any more events
## there just has to be a better way
data3 <- step2[step2$event==1,]
data3<- data3[,1:3]
step3 <- summaryBy(Date~ID, data = data3, FUN=min)
step3$Date30 <- step3$Date.min+30
step4 <- merge(data3, step3, by.x="ID", by.y="ID")
step4$event <- ifelse(as.numeric(step4$Date) >= step4$Date.min & as.numeric(step4$Date) <= step4$Date30, 0, 1)
data4 <- step4[step4$event==1,]
data4<- data4[,1:3]
step5 <- summaryBy(Date~ID, data = data4, FUN=min)
step5$Date30 <- step5$Date.min+30
## then I rbind the "keepers"
## in this case steps 1 and 3 above
final <- rbind(step1,step3, step5)
## then reformat
final <- final[,1:2]
final$Date.min <- as.Date(final$Date.min,origin="1970-01-01")
## again, extremely clumsy, but it works... HELP! :)