You could try using merge:

   >
d<-data.frame(Subject=rep(11:13,each=3),Time=101:109,Marker=c(0,1,0,
0,0,0, 0,0,1))
   > d
     Subject Time Marker
   1      11  101      0
   2      11  102      1
   3      11  103      0
   4      12  104      0
   5      12  105      0
   6      12  106      0
   7      13  107      0
   8      13  108      0
   9      13  109      1
   > d$Time - merge(d,d[d$Marker==1,],by="Subject",all.x=TRUE)$Time.y
   [1] -1  0  1 NA NA NA -2 -1  0

If you want the reference times for Subjects without a
marked instance to be 0, replace the NA's in Time.y by 0:
   > NAtoZero<-function(x){ x[is.na(x)]<-0 ; x }
   > d$Time -
NAtoZero(merge(d,d[d$Marker==1,],by="Subject",all.x=TRUE)$Time.y)
   [1]  -1   0   1 104 105 106  -2  -1   0

If there is more than one marked instance for
a given subject this method will fail.

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com  

> -----Original Message-----
> From: r-help-boun...@r-project.org 
> [mailto:r-help-boun...@r-project.org] On Behalf Of Dennis Fisher
> Sent: Friday, December 04, 2009 2:47 PM
> To: r-h...@stat.math.ethz.ch
> Subject: [R] Use of apply rather than a loop
> 
> Colleagues,
> 
> R 2.9.0 on all platforms
> 
> I have a dataset that contains three columns of interest: 
> ID's, serial  
> elapsed times, and a marker.  Representative data:
> Subject               Time            Marker
> 1                     100.5           0
> 1                     101                     0
> 1                     102                     1
> 1                     103                     0
> 1                     105                     0
> 
> For each subject, I would like to find the time associated 
> with MARKER  
> == 1, then replace Time with Time - (Time[Marker == 1])
> The result for this subject would be:
> Subject               Time            Marker
> 1                     -1.5                    0
> 1                     -1                      0
> 1                     0                       1
> 1                     1                       0
> 1                     3                       0
> 
> One proviso: some subjects do not have Marker == 1; for these  
> subjects, I would like Time to remain unchanged.
> 
> At present, I am looping over each subject.  The number of 
> subjects is  
> large so this process is quite slow.  I assume that one of the apply  
> functions could speed this markedly but I am not facile with them.   
> Any help would be appreciated.
> 
> Dennis
> 
> Dennis Fisher MD
> P < (The "P Less Than" Company)
> Phone: 1-866-PLessThan (1-866-753-7784)
> Fax: 1-866-PLessThan (1-866-753-7784)
> www.PLessThan.com
> 
> ______________________________________________
> 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.
> 

______________________________________________
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.

Reply via email to