[R] Use of apply rather than a loop

William Dunlap wdunlap at tibco.com
Sat Dec 5 00:29:12 CET 2009


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-bounces at r-project.org 
> [mailto:r-help-bounces at r-project.org] On Behalf Of Dennis Fisher
> Sent: Friday, December 04, 2009 2:47 PM
> To: r-help at 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 at 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.
> 




More information about the R-help mailing list