Seems you want to diff X, not lag it.
We can either maintain the long form of the data and do it as in #1
or convert the data to "wide" form and do it as in #2 which is most
convenient using zoo where we make the individual time series into
zoo series, merge them and then apply diff:
Lines <- "ID Year X
AB12 2000 100
AB12 2001 120
AB12 2002 140
AB12 2003 80
BL14 2000 180
BL14 2001 150
CR93 2000 45
CR93 2001 49
CR93 2002 56
CR93 2003 67
"
DF <- read.table(textConnection(Lines), header = TRUE)
# 1
f <- function(DF) cbind(DF[,1:2], diff = c(NA, diff(DF$X)))
DF.by <- by(DF, DF$ID, f)
do.call("rbind", DF.by)
# 2
library(zoo)
fz <- function(DF) zoo(DF$X, DF$Year)
diff(do.call("merge", by(DF, DF$ID, fz)), na.pad = TRUE)
For more info on zoo:
library(zoo)
vignette("zoo")
On 6/4/07, Anup Nandialath <anup_nandialath at yahoo.com>
wrote:> Dear Friends,
>
> I have some data with three columns named ID, Year and Measure X. I need to
create a column which gives me a lag for each ID (note not a continous lag), but
a lag conditional on the id and the given year. Please find below a sample of
the data
>
> Input file sample
>
> ID Year X
>
> AB12 2000 100
> AB12 2001 120
> AB12 2002 140
> AB12 2003 80
> BL14 2000 180
> BL14 2001 150
> CR93 2000 45
> CR93 2001 49
> CR93 2002 56
> CR93 2003 67
>
> Expected output from this data
>
> ID Year Xlag
> AB12 2000 .
> AB12 2001 20
> AB12 2002 20
> AB12 2003 -60
> BL12 2000 .
> BL14 2001 -30
> CR93 2000 .
> CR93 2001 5
> CR93 2002 7
> CR93 2003 9
>
> Can somebody please help me with how to implement this in R. Thanks.
>
> Sincerely
>
> Anup
>
>
>
> ---------------------------------
> Looking for a deal? Find great prices on flights and hotels with Yahoo!
FareChase.
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at stat.math.ethz.ch 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.
>