On 08/26/2013 11:44 PM, Michael Friendly wrote:
...
Thanks for trying again, but that doesn't work either with a by=
variable. Note that your function is recursive, and also k=k
should be passed in the else{ ... lags() }.

Hi Michael,
You are correct about the k=, and I had used a separate object for the by= argument which did work. So, I tried to work around the problem of having the by= argument look like an object with deparse(substitute()) but couldn't get it to go. However, if you can live with passing the factor name as a string, this seems to work.

lags<-function(x,k=1,prefix='lag',by) {
 if(missing(by)) {
  n<-length(x)
  res<-data.frame(lag0=x)
  for(i in 1:k) res<-cbind(res,c(rep(NA,i),x[1:(n-i)]))
  colnames(res)<-paste0(prefix,0:k)
 }
 else {
  byfac<-factor(unlist(x[by]))
  x<-x[!(names(x) %in% by)]
  for(levl in levels(byfac)) {
   nextlags<-lags(x[byfac==levl,],k=k,prefix=prefix)
   rownames(nextlags)<-paste(levl,rownames(nextlags),sep=".")
   if(exists("res")) res<-rbind(res,nextlags)
   else res<-nextlags
  }
 }
 return(res)
}

lags(events2,3,by="sub")
    lag0 lag1 lag2 lag3
1.1    b <NA> <NA> <NA>
1.2    c    b <NA> <NA>
1.3    c    c    b <NA>
1.4    d    c    c    b
1.5    c    d    c    c
2.1    d <NA> <NA> <NA>
2.2    c    d <NA> <NA>
2.3    d    c    d <NA>
2.4    a    d    c    d
2.5    a    a    d    c


Jim

______________________________________________
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