On 8/25/2013 8:12 PM, Jim Lemon wrote:
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 { for(levl in levels(by)) { nextlags<-lags(x[by==levl],prefix=prefix) rownames(nextlags)<-paste(levl,rownames(nextlags),sep=".") if(exists("res")) res<-rbind(res,nextlags) else res<-nextlags } } return(res) }
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() }. > events <- sample(letters[1:4], 10, replace=TRUE) > lags(events) lag0 lag1 1 c <NA> 2 b c 3 d b 4 d d 5 b d 6 b b 7 b b 8 c b 9 a c 10 a a > lags(events, 3) lag0 lag1 lag2 lag3 1 c <NA> <NA> <NA> 2 b c <NA> <NA> 3 d b c <NA> 4 d d b c 5 b d d b 6 b b d d 7 b b b d 8 c b b b 9 a c b b 10 a a c b > > events2 <- data.frame(sub=factor(rep(1:2, each=5)), + event=sample(letters[1:4], 10, replace=TRUE), + stringsAsFactors=FALSE) > events2 sub event 1 1 b 2 1 c 3 1 a 4 1 a 5 1 b 6 2 a 7 2 b 8 2 a 9 2 b 10 2 a > lags(events2, 2, by=sub) Error in lags(events2, 2, by = sub) : object 'res' not found > lags(events2, by=sub) Error in lags(events2, by = sub) : object 'res' not found -Michael -- Michael Friendly Email: friendly AT yorku DOT ca Professor, Psychology Dept. & Chair, Quantitative Methods York University Voice: 416 736-2100 x66249 Fax: 416 736-5814 4700 Keele Street Web: http://www.datavis.ca Toronto, ONT M3J 1P3 CANADA ______________________________________________ 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.