gpt4 book ai didi

r - 检测是否间隔给药

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

尽管相当接近(据说),但无法弄清楚这一点。我想检查是否在 4 小时窗口内给药。

  drug start stop
1 A 1 3
2 A 7 10
3 A 11 17

药物 A 在时间 1 开始给药,直至时间 3;然后在时间 7 再次开始,直到时间 10 等。
  t1 t2
1 0 4
2 4 8
3 8 12
4 12 16
5 16 20
6 20 24

这些是有问题的 window

数据:
t1 <- c(0,4,8,12,16,20)
t2 <- t1 + 4
chunks <- data.frame(t1=t1,t2=t2)

drug <- "A"
start <- c(1,7,11)
stop <- c(3,10,17)
times <- data.frame(drug,start,stop)

预期解决方案
  t1 t2 lsg
1 0 4 1
2 4 8 1
3 8 12 1
4 12 16 1
5 16 20 1
6 20 24 0

尝试解决方案
test <- function(){
n <- 1
for (row in times){
result <- (times$start[n] > chunks$t1 & times$stop[n] < chunks$t2) | ((times$start[n] > chunks$t1 & times$start[n] < chunks$t2) & (times$stop[n] > chunks$t2 | times$stop[n] < chunks$t2)) | (times$start[n] < chunks$t1 & times$stop[n] > chunks$t1)
n <- n + 1
print(result)
}
}


[1]  TRUE FALSE FALSE FALSE FALSE FALSE
[1] FALSE TRUE TRUE FALSE FALSE FALSE
[1] FALSE FALSE TRUE TRUE TRUE FALSE

哪个是正确的!第一次管理落入了第一时间窗口。第二和第三管理落入第二和第三窗口等。但是如何到达
预期的解决方案?

正如我所说,我感觉很接近,但我不知道如何将结果加入 chunks-df ...

最佳答案

前半部分是@akrun 的评论,但已扩展为包括先决条件。 (如果你回来回答,我很乐意听从你的意见……只是在这里提供更多细节。)下半场是新的(并且经常被忽视)。

数据表
data.table::foverlaps基于重叠/不等式进行连接(与基 mergedplyr::*_join 相反,后者仅在严格等式上运行)。使用的先决条件 overlaps (除了是 data.table 类)是时间字段是 key编辑正确。

library(data.table)
setDT(times)
setDT(chunks)

# set the keys
setkey(times, start, stop)
setkey(chunks, t1, t2)

# the join

+(!is.na(foverlaps(chunks, times, which = TRUE, mult = 'first')))
# [1] 1 1 1 1 1 0

该函数实际上返回 times 中每行的哪一行对应于 chunks :

foverlaps(chunks, times, which = TRUE, mult = 'first')
# [1] 1 2 2 3 3 NA

sqldf
data.table不是唯一让这种情况发生的 R 工具。此解决方案适用于 data.frame 的任何变体(基础, data.tabletbl_df )。

这是这个:

library(sqldf)
sqldf("
select c.t1, c.t2,
(case when drug is null then 0 else 1 end) > 0 as n
from chunks c
left join times t on
(t.start between c.t1 and c.t2) or (t.stop between c.t1 and c.t2)
or (c.t1 between t.start and t.stop) or (c.t2 between t.start and t.stop)
group by c.t1, c.t2")
# t1 t2 n
# 1 0 4 1
# 2 4 8 1
# 3 8 12 1
# 4 12 16 1
# 5 16 20 1
# 6 20 24 0

(我不知道是否可以减少该连接的逻辑,也不知道它是否会与其他数据发生错误行为。)

如果你需要每个时间范围内发生的药物计数,我认为你可以使用 sum(case when ... end) as n .

关于r - 检测是否间隔给药,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62053582/

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