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
______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.