Hi, You can also try with aggregate() or ddply() dat2<-aggregate(dat,list(dat$stock_symbol,dat$tdate),FUN=function(x) head(x,1)) dat2[,3:6] # tdate stock_symbol expiration strike #1 9/11/2012 C 9/16/2012 11 #2 9/12/2012 C 9/16/2012 14
library(plyr) ddply(dat,.(stock_symbol,tdate), function(x) head(x,1)) # tdate stock_symbol expiration strike #1 9/11/2012 C 9/16/2012 11 #2 9/12/2012 C 9/16/2012 14 A.K. ----- Original Message ----- From: David Winsemius <dwinsem...@comcast.net> To: ramoss <ramine.mossad...@finra.org> Cc: r-help@r-project.org Sent: Wednesday, October 10, 2012 5:42 PM Subject: Re: [R] How to replicate SAS by group processing in R On Oct 10, 2012, at 11:09 AM, ramoss wrote: > Hello, > > I am trying to re-code all my programs from SAS into R. > > In SAS I use the following code: > > proc sort data=upper; > by tdate stock_symbol expire strike; > run; > data upper1; > set upper; > by tdate stock_symbol expire strike; I must have forgotten my SAS. (It was a lng time ago I will admit.) Would that have succeeded with the inclusion of 'strike' in that 'by' list? > if first.expire then output; > rename strike=astrike; > run; > > on the following data set: > > tdate stock_symbol expiration strike > 9/11/2012 C 9/16/2012 11 > 9/11/2012 C 9/16/2012 12 > 9/11/2012 C 9/16/2012 13 > 9/12/2012 C 9/16/2012 14 > 9/12/2012 C 9/16/2012 15 > 9/12/2012 C 9/16/2012 16 > 9/12/2012 C 9/16/2012 17 > > to get the following results: > tdate stock_symbol expiration strike > 9/11/2012 C 9/16/2012 11 > 9/12/2012 C 9/16/2012 14 > dat[tapply(1:nrow(dat), list( dat$stock_symbol, dat$tdate), FUN= function(x) > head(x,1) ), ] tdate stock_symbol expiration strike 1 9/11/2012 C 9/16/2012 11 4 9/12/2012 C 9/16/2012 14 > > > How would I replicate this kind of logic in R? > I have seen PLY & data.table packages mentioned but don't see how they would > do the job. You must mean the 'plyr' package; there is no "PLY'. I'm sure the 'ddply' function or data.table could do this. Here's another way with the R 'by' function which is then row-bound using 'do.call': > do.call( rbind, by(dat, list( dat$stock_symbol, dat$tdate), FUN= function(x) > head(x,1) ) ) tdate stock_symbol expiration strike 1 9/11/2012 C 9/16/2012 11 4 9/12/2012 C 9/16/2012 14 -- David Winsemius, MD Alameda, CA, USA ______________________________________________ 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.