作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
尽管相当接近(据说),但无法弄清楚这一点。我想检查是否在 4 小时窗口内给药。
drug start stop
1 A 1 3
2 A 7 10
3 A 11 17
t1 t2
1 0 4
2 4 8
3 8 12
4 12 16
5 16 20
6 20 24
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
最佳答案
前半部分是@akrun 的评论,但已扩展为包括先决条件。 (如果你回来回答,我很乐意听从你的意见……只是在这里提供更多细节。)下半场是新的(并且经常被忽视)。
数据表data.table::foverlaps
基于重叠/不等式进行连接(与基 merge
和 dplyr::*_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
data.table
不是唯一让这种情况发生的 R 工具。此解决方案适用于
data.frame
的任何变体(基础,
data.table
或
tbl_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/
我是一名优秀的程序员,十分优秀!