[R] Re membering the last time an event occurred within a dataframe
Duncan Murdoch
murdoch at stats.uwo.ca
Thu Jul 3 20:45:06 CEST 2008
On 7/3/2008 2:19 PM, Jim Price wrote:
> All,
>
> I am constructing a pharmacokinetic dataset and have hit a snag. The dataset
> can be demonstrated in the following way:
>
>
>
> myData <- data.frame(
> evid = c(1, 0, 0, 0, 1, 0, 1, 1, 1, 0),
> time = 1:10,
> last.dose.time = c(1, 1, 1, 1, 5, 5, 7, 8, 9, 9)
> )
>
>
> The evid field is an indicator variable for whether the associated
> observation is a dosing record (when it takes value 1) or an observation
> (where it takes value 0). The time field is a date-time record for the
> associated dose / observation event. I'm trying to calculate the time since
> the last dose for each observation event - to support that, the data I'd
> like to end up with is contained in last.dose.time, which gives the time at
> which the last dosing event occured.
>
> The problem is in calculating the last.dose.time field; this is the first
> time I've done this particular kind of data manipulation in R and I just
> can't get my head around the code to solve it.
>
> I've been eyeballing rle and I think there may be a solution hiding in there
> somewhere, but I'm still failing to progress. Any help would be appreciated!
This may not be the easiest way, but it's very general: create a
function that returns the last time, and evaluate it at all of the
times. For example,
Extract just the dosing times:
> sub <- subset(myData, evid == 1)
Create the step function:
> f <- approxfun(sub$time, sub$time, method="constant", rule=2)
Evaluate it:
> f(myData$time)
[1] 1 1 1 1 5 5 7 8 9 9
The construction of f assumes that the times are in increasing order,
and its definition assumes you have no observations before the earliest
dosing time. You'll need a bit more fiddling (sort the times, figure
out what value to give before dosing) if those assumptions don't hold.
Duncan Murdoch
More information about the R-help
mailing list