gpt4 book ai didi

r - 每个主题每 X 天计算一次事件(在不规则的时间序列中)

转载 作者:行者123 更新时间:2023-12-04 23:07:04 25 4
gpt4 key购买 nike

我有数据来计算护理次数(例如急诊就诊)。诀窍是,我不能计算每一次访问,因为有时第二次或第三次访问实际上是对前一个问题的跟进。因此,我被指示使用 30 天的“清洁期”或“停电期”来计算访问次数,因此,我按患者(最小日期)查找第一个事件(访问 1),我计算该事件,然后应用规则,以便不计算第一个事件后 30 天内发生的任何访问。在 30 天窗口期过后,我可以开始寻找第 2 次访问(访问 2),计算第 1 次,然后再次应用 30 天停电(不计算访问 #2 后 30 天内发生的任何访问)。 .. 清洗、冲洗、重复...

我已经组装了一个非常草率的解决方案,需要大量的保姆和手动检查步骤(见下文)。我必须相信有更好的方法。帮助!

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! :)

最佳答案

此解决方案是无循环的,仅使用基数 R。它生成一个逻辑向量 ok选择可接受的行 data1 .
ave分别对每个患者运行指定的匿名函数。

我们定义了一个状态向量,它由当前日期和不考虑其他日期的时期的开始组成。每个日期由 as.numeric(x) 表示哪里x是日期。 step获取状态向量和当前日期并更新状态向量。 Reduce在数据上运行它,然后我们只获取最小日期和当前日期相同且当前日期不重复的结果。

step <- function(init, curdate) {
c(curdate, if (curdate > init[2] + 30) curdate else init[2])
}

ok <- !!ave(as.numeric(data1$Date), paste(data1$ID), FUN = function(d) {
x <- do.call("rbind", Reduce(step, d, c(-Inf, 0), acc = TRUE))
x[-1,1] == x[-1,2] & !duplicated(x[-1,1])
})

data1[ok, ]

关于r - 每个主题每 X 天计算一次事件(在不规则的时间序列中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9814387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com