Yes, the stats package has a lag function, but it's not really appropriate
for the sample data Dimitri gave us: to wit, it's not of "ts" (time series)
class so lag doesn't know what to do with it and gives an error message.
Perhaps it's just that I never really took the time to get used to it, but
I'm not a fan of R's "ts" class

And while I do endorse the use of time series objects over data frames when
appropriate, I'd suggest going for the xts class which has greater
functionality and it's default lag seems to have a more logical default:
lagging the series in xts moves the first data point back, while it moves it
forward in the ts class.

I guess my point is: if Dimitri is working with the dates directly instead
of time series (as some of his other posts have suggested), he should stay
in the data frame type and use the lag I, Daniel, or Josh wrote: if he has
proper time series, he might as well jump right into xts.

Michael Weylandt

On Thu, Aug 4, 2011 at 7:57 PM, Ken H <[email protected]> wrote:

> Hey all,
>   Correct me if I'm wrong but, the 'stats' package has a lag() function
> like so
>    lagged.series=lag(series,number of lags wanted)
>    Furthermore, I am pretty sure that lag( ) accepts negative lags:=>
> leads.
>                   lag(x,1)=> object of one lag, lag(x,-1) object with one
> lead.
>               Hope this answers your question,
>                        Ken
>
> On Thu, Aug 4, 2011 at 4:19 PM, Dimitri Liakhovitski <
> [email protected]> wrote:
>
> > Thanks a lot for the recommendations - some of them I am implementing
> > already.
> >
> > Just a clarification:
> > the only reason I try to compare things to SPSS is that I am the only
> > person in my office using R. Whenever I work on an R code my goal is
> > not just to make it work, but also to "boast" to the SPSS users that
> > it's much easier/faster/niftier in R. So, you are preaching to the
> > choir here.
> >
> > Dimitri
> >
> >
> > On Thu, Aug 4, 2011 at 4:02 PM, Joshua Wiley <[email protected]>
> > wrote:
> > >
> > >
> > > On Aug 4, 2011, at 11:46, Dimitri Liakhovitski <
> > [email protected]> wrote:
> > >
> > >> Thanks a lot, guys!
> > >> It's really helpful. But - to be objective- it's still quite a few
> > >> lines longer than in SPSS.
> > >
> > > Not once you've sources the function!  For the simple case of a vector,
> > try:
> > >
> > > X <- 1:10
> > > mylag2 <- function(X, lag) {
> > >  c(rep(NA, length(seq(lag))), X[-seq(lag)])
> > > }
> > >
> > > Though this does not work for lead, it is fairly short. Then you could
> > use the *apply family if you needed it on multiple columns or vectors.
> > >
> > > Cheers,
> > >
> > > Josh
> > >
> > >> Dimitri
> > >>
> > >> On Thu, Aug 4, 2011 at 2:36 PM, Daniel Nordlund <
> > [email protected]> wrote:
> > >>>
> > >>>
> > >>>> -----Original Message-----
> > >>>> From: [email protected] [mailto:
> > [email protected]]
> > >>>> On Behalf Of Dimitri Liakhovitski
> > >>>> Sent: Thursday, August 04, 2011 8:24 AM
> > >>>> To: r-help
> > >>>> Subject: [R] Efficient way of creating a shifted (lagged) variable?
> > >>>>
> > >>>> Hello!
> > >>>>
> > >>>> I have a data set:
> > >>>> set.seed(123)
> > >>>> y<-data.frame(week=seq(as.Date("2010-01-03"), as.Date("2011-01-
> > >>>> 31"),by="week"))
> > >>>> y$var1<-c(1,2,3,round(rnorm(54),1))
> > >>>> y$var2<-c(10,20,30,round(rnorm(54),1))
> > >>>>
> > >>>> # All I need is to create lagged variables for var1 and var2. I
> looked
> > >>>> around a bit and found several ways of doing it. They all seem quite
> > >>>> complicated - while in SPSS it's just a few letters (like LAG()).
> Here
> > >>>> is what I've written but I wonder. It works - but maybe there is a
> > >>>> very simple way of doing it in R that I could not find?
> > >>>> I need the same for "lead" (opposite of lag).
> > >>>> Any hint is greatly appreciated!
> > >>>>
> > >>>> ### The function I created:
> > >>>> mylag <- function(x,max.lag=1){   # x has to be a 1-column data
> frame
> > >>>>    temp<-
> > >>>>
> > as.data.frame(embed(c(rep(NA,max.lag),x[[1]]),max.lag+1))[2:(max.lag+1)]
> > >>>>    for(i in 1:length(temp)){
> > >>>>      names(temp)[i]<-paste(names(x),".lag",i,sep="")
> > >>>>     }
> > >>>>   return(temp)
> > >>>> }
> > >>>>
> > >>>> ### Running mylag to get my result:
> > >>>> myvars<-c("var1","var2")
> > >>>> for(i in myvars) {
> > >>>>   y<-cbind(y,mylag(y[i]),max.lag=2)
> > >>>> }
> > >>>> (y)
> > >>>>
> > >>>> --
> > >>>> Dimitri Liakhovitski
> > >>>> marketfusionanalytics.com
> > >>>>
> > >>>
> > >>> Dimitri,
> > >>>
> > >>> I would first look into the zoo package as has already been
> suggested.
> >  However, if you haven't already got your solution then here are a couple
> of
> > functions that might help you get started.  I won't vouch for efficiency.
> > >>>
> > >>>
> > >>> lag.fun <- function(df, x, max.lag=1) {
> > >>>  for(i in x) {
> > >>>    for(j in 1:max.lag){
> > >>>      lagx <- paste(i,'.lag',j,sep='')
> > >>>      df[,lagx] <- c(rep(NA,j),df[1:(nrow(df)-j),i])
> > >>>    }
> > >>>  }
> > >>>  df
> > >>> }
> > >>>
> > >>> lead.fun <- function(df, x, max.lead=1) {
> > >>>  for(i in x) {
> > >>>    for(j in 1:max.lead){
> > >>>      leadx <- paste(i,'.lead',j,sep='')
> > >>>      df[,leadx] <- c(df[(j+1):(nrow(df)),i],rep(NA,j))
> > >>>    }
> > >>>  }
> > >>>  df
> > >>> }
> > >>>
> > >>> y <- lag.fun(y,myvars,2)
> > >>> y <- lead.fun(y,myvars,2)
> > >>>
> > >>>
> > >>> Hope this is helpful,
> > >>>
> > >>> Dan
> > >>>
> > >>> Daniel Nordlund
> > >>> Bothell, WA USA
> > >>>
> > >>>
> > >>>
> > >>
> > >>
> > >>
> > >> --
> > >> Dimitri Liakhovitski
> > >> marketfusionanalytics.com
> > >>
> > >> ______________________________________________
> > >> [email protected] 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.
> > >
> >
> >
> >
> > --
> > Dimitri Liakhovitski
> > marketfusionanalytics.com
> >
> > ______________________________________________
> > [email protected] 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.
> >
>
>         [[alternative HTML version deleted]]
>
> ______________________________________________
> [email protected] 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.
>

        [[alternative HTML version deleted]]

______________________________________________
[email protected] 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