Skip to content

number of patients in a hospital on a given date

3 messages · RINNER Heinrich, Thomas Gerds, Marc Schwartz

#
Dear R-users!

I am using R 1.7.0, under Windows XP.

Having some hospital discharge data (admission date and discharge date for
each patient), I want to get the number of patients in the hospital on a
given date.

My data look like (simple example):
"16.03.2002"),
       dis.date=c("18.03.2002", "17.03.2002"))

I can easily do a date-time conversion from the character objects:
patid   adm.date   dis.date
1  pat1 2002-03-15 2002-03-18
2  pat2 2002-03-16 2002-03-17

What I want in the end is something like a data.frame A like this:
A
date		no.of.patients
2002-03-14	0
2002-03-15	1
2002-03-16	2
2002-03-17	2
2002-03-18	1
2002-03-19	0

Or, alternatively, a data.frame B like this:
B
patid	date.in.hospital
pat1	2002-03-15
pat1	2002-03-16
pat1	2002-03-17
pat1	2002-03-18
pat2	2002-03-16
pat2	2002-03-17
So the trick would be to get a data.frame with one line for each day of each
patient in the hospital - but how?

I'd be happy about any ideas,
Heinrich Rinner.
#
how about this:

x <- data.frame(patid=c("pat1", "pat2"), adm.date = c("15.03.2002","16.03.2002"),dis.date=c("18.03.2002", "17.03.2002"))
x[,2:3] <- apply(x[,2:3], MARGIN=2, FUN=strptime, format="%d.%m.%Y")
alldays <- c("2002-03-14","2002-03-15","2002-03-16","2002-03-17","2002-03-18","2002-03-19")
tmp <- table(unlist(apply(x,
                          1,
                          function(y){
                            beg <- match(y[2],alldays)
                            end <- match(y[3],alldays)
                            alldays[beg:end]})))
nulldays <- alldays[match(alldays,names(tmp),nomatch=0)==0]
out <- rbind(data.frame(days=c(names(tmp),nulldays),freq=c(as.numeric(tmp),rep(0,length(nulldays)))))
out[order(out$days),]

        days freq
5 2002-03-14    0
1 2002-03-15    1
2 2002-03-16    2
3 2002-03-17    2
4 2002-03-18    1
6 2002-03-19    0

tomy

RINNER Heinrich <H.RINNER at tirol.gv.at> writes:

  
    
#
Heinrich
format="%d.%m.%Y")
Heinrich,

How about something like this:

x <- data.frame(patid = c("pat1", "pat2"), 
                adm.date = c("15.03.2002", "16.03.2002"),
                dis.date = c("18.03.2002", "17.03.2002"))

x[,2:3] <- apply(x[,2:3], MARGIN = 2, FUN = strptime, format =
"%d.%m.%Y")

x is then:
patid   adm.date   dis.date
1  pat1 2002-03-15 2002-03-18
2  pat2 2002-03-16 2002-03-17

days <- NULL

# generate a combined sequence of days all patients are in the
hospital
# based upon the intervals from admit to discharge
for (i in 1:nrow(x))
{
    days <- c(days, 
                format(seq(from = x$adm.date[i], to = x$dis.date[i],
by = "day"), 
                "%Y-%m-%d"))
}

days is then:
[1] "2002-03-15" "2002-03-16" "2002-03-17" "2002-03-18" "2002-03-16"
"2002-03-17"

# Now create a dataframe from the results of table(days)
days.table <- data.frame(table(days))

days.table is then:
days Freq
1 2002-03-15    1
2 2002-03-16    2
3 2002-03-17    2
4 2002-03-18    1


HTH,

Marc Schwartz