> -----Original Message----- > From: r-help-boun...@r-project.org > [mailto:r-help-boun...@r-project.org] On Behalf Of William Dunlap > Sent: Friday, December 04, 2009 3:29 PM > To: Dennis Fisher; r-h...@stat.math.ethz.ch > Subject: Re: [R] Use of apply rather than a loop > > 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
merge() can rearrange the rows of the data.frame so I should have diff'ed 2 columns from the merged data.frame, not one from the original and one from the merged. E.g., > d <- d[sample(nrow(d)),] # scramble rows > dm <- merge(d,d[d$Marker==1,],by="Subject",all.x=TRUE, suffixes=c("", "Marked")) > dm$TimeMinusMarkedTime <- dm$Time - NAtoZero(dm$TimeMarked) > dm <- dm[ with(dm, order(Subject, Time)), ] # put into nice order > dm$TimeMinusMarkedTime [1] -1 0 1 NA NA NA -2 -1 0 > dm Subject Time Marker TimeMarked MarkerMarked TimeMinusMarkedTime 3 11 101 0 102 1 -1 1 11 102 1 102 1 0 2 11 103 0 102 1 1 5 12 104 0 NA NA 104 4 12 105 0 NA NA 105 6 12 106 0 NA NA 106 7 13 107 0 109 1 -2 9 13 108 0 109 1 -1 8 13 109 1 109 1 0 When there are lots of unique values in Subject this is considerably faster than any sort of looping approach. Bill Dunlap Spotfire, TIBCO Software wdunlap tibco.com > > 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. > ______________________________________________ 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.