如何识别r中的时间重叠 [英] how to identify time overlap in r
问题描述
我有一个数据框(df)与患者的入院和出院日期有4列:
I have a dataframe (df) with admission and discharge dates of patients, with 4 columns:
ID,admitDate(as date ),dcDate(as date),los(逗留时间在
天)。
ID, admitDate (as date), dcDate (as date), los (length of stay in days).
$ admitDate : Date, format: "2009-09-19" "2010-01-24" "2010-09-30" ...
$ dcDate : Date, format: "2009-09-23" "2010-01-27" "2010-10-04" ...
$ los : num 4 3 4 25 6 3 6 2 2 3 ...
我需要能够告诉任何给定的时间有多少病人(和哪些病人)被录取。也就是说,我想我需要找出病人的重叠。这是我如何定义重叠:(df $ admitDate [x]< = df $ disDate [y])& (df $ admitDate [y]< = df $ disDate [x])
I need to be able to tell at any given time how many patients (and which patients) were admitted. That is, I think I need to find out the overlap between the patients' los. Here is how I'm defining overlap: (df$admitDate[x] <= df$disDate[y]) & (df$admitDate[y] <= df$disDate[x])
任何帮助都非常感激。
Any help is much appreciated.
以下是前20名患者的输出输出:
Here is the output of dput for the first 20 patients:
> dput(head(df,20))
structure(list(Unit.Number = c(2013459L, 2013459L, 2047815L,
1362858L, 1331174L, 2068040L, 1363711L, 2175972L, 2036695L, 1426614L,
1403126L, 2083126L, 1334063L, 1349385L, 1404482L, 2175545L, 1296600L,
1293220L, 1336768L, 2148401L), admitDate = structure(c(14506,
14633, 14882, 15172, 14945, 15632, 15482, 15601, 16096, 15843,
16013, 15548, 15436, 15605, 16115, 15597, 15111, 15050, 15500,
15896), class = "Date"), dcDate = structure(c(14510, 14636, 14886,
15197, 14951, 15635, 15488, 15603, 16098, 15846, 16016, 15552,
15438, 15606, 16118, 15598, 15113, 15058, 15501, 15915), class = "Date"),
los = c(4, 3, 4, 25, 6, 3, 6, 2, 2, 3, 3, 4, 2, 1, 3, 1,
2, 8, 1, 19)), .Names = c("Unit.Number", "admitDate", "dcDate",
"los"), row.names = c(NA, 20L), class = "data.frame")
首先,我尝试了G. Grothendieck建议的代码:
First, I tried the code suggested by G. Grothendieck:
days <- seq(min(df$admitDate), max(df$dcDate), "day")
no.patients <- data.frame(
Date = days,
Num = sapply(days, function(d) sum(d >= df$admitDate & d <= df$dcDate)),
Patients = sapply(days, function(d)
toString(df$Unit.Number[d >= df$admitDate & d <= df$dcDate]))
)
这里是发生了什么:
> days <- seq(min(df$admitDate), max(df$dcDate), "day")
Error in seq.int(0, to0 - from, by) : 'to' cannot be NA, NaN or infinite
> no.patients <- data.frame(Date = d,
+ Num = sapply(days, function(d) sum(d >= df$admitDate & d <= df$dcDate)))
Error in data.frame(Date = d, Num = sapply(days, function(d) sum(d >= :
object 'd' not found
然后,我想也许我需要摆脱NA,所以这里是我做的:
Then, I thought maybe I need to get rid of NA's. So here is what I did:
> df <- df[rowSums(is.na(df)) < 0, ]
再次尝试,这是我得到的:
And tried again. Here is what I got:
> days <- seq(min(df$admitDate), max(df$dcDate), "day")
Error in seq.int(0, to0 - from, by) : 'to' cannot be NA, NaN or infinite
In addition: Warning messages:
1: In min.default(numeric(0), na.rm = FALSE) :
no non-missing arguments to min; returning Inf
2: In max.default(numeric(0), na.rm = FALSE) :
no non-missing arguments to max; returning -Inf
> no.patients <- data.frame(Date = d,
+ Num = sapply(days, function(d) sum(d >= df$admitDate & d <= df$dcDate)))
Error in data.frame(Date = d, Num = sapply(days, function(d) sum(d >= :
object 'd' not found
推荐答案
这是另一种方式,这是一个过程将基于进入/退出时间创建队列的大小,并且可以在这种情况下用于计算患者人数:
Here is another way. This is a process that will create the size of the queue based on entry/exit times and can be used in this case to compute the number of patients:
df <- structure(list(Unit.Number = c(2013459L, 2013459L, 2047815L,
1362858L, 1331174L, 2068040L, 1363711L, 2175972L, 2036695L, 1426614L,
1403126L, 2083126L, 1334063L, 1349385L, 1404482L, 2175545L, 1296600L,
1293220L, 1336768L, 2148401L), admitDate = structure(c(14506,
14633, 14882, 15172, 14945, 15632, 15482, 15601, 16096, 15843,
16013, 15548, 15436, 15605, 16115, 15597, 15111, 15050, 15500,
15896), class = "Date"), dcDate = structure(c(14510, 14636, 14886,
15197, 14951, 15635, 15488, 15603, 16098, 15846, 16016, 15552,
15438, 15606, 16118, 15598, 15113, 15058, 15501, 15915), class = "Date"),
los = c(4, 3, 4, 25, 6, 3, 6, 2, 2, 3, 3, 4, 2, 1, 3, 1,
2, 8, 1, 19)), .Names = c("Unit.Number", "admitDate", "dcDate",
"los"), row.names = c(NA, 20L), class = "data.frame")
# create dataframe for computing the size of the queue (concurrent patients)
x <- data.frame(date = c(df$admitDate, df$dcDate)
, op = c(rep(1, nrow(df)), rep(-1, nrow(df)))
, Unit.Number = c(df$Unit.Number, df$Unit.Number)
)
# sort and calculate concurrent patients
x <- x[order(x$date), ] # sort in time order
x$cum <- cumsum(x$op)
# 'x' will have the 'cum' equal to the number of patients concurrently.
# for 'op' == 1, you have the patient ID and 'cum' will be the number of
# patients at that time.
plot(x$date, x$cum, type = 's')
这是'x'的第一部分:
This is what the first part of 'x' looks like:
> head(x,10)
date op Unit.Number cum
1 2009-09-19 1 2013459 1
21 2009-09-23 -1 2013459 0
2 2010-01-24 1 2013459 1
22 2010-01-27 -1 2013459 0
3 2010-09-30 1 2047815 1
23 2010-10-04 -1 2047815 0
5 2010-12-02 1 1331174 1
25 2010-12-08 -1 1331174 0
18 2011-03-17 1 1293220 1
38 2011-03-25 -1 1293220 0
>
这篇关于如何识别r中的时间重叠的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!