You can use head
and tail
as follows
df2$l1pm10 <- c(tail(df2$pm10, -1), NA)
df2$l1pm102 <- c(NA, head(df2$pm10, -1))
df2
#R> var1 pm10 l1pm10 l1pm102
#R> 1 1 26.95607 NA NA
#R> 2 2 NA 32.83869 26.95607
#R> 3 3 32.83869 39.95607 NA
#R> 4 4 39.95607 NA 32.83869
#R> 5 5 NA 40.95607 39.95607
#R> 6 6 40.95607 33.95607 NA
#R> 7 7 33.95607 28.95607 40.95607
#R> 8 8 28.95607 32.34877 33.95607
#R> 9 9 32.34877 NA 28.95607
#R> 10 10 NA NA 32.34877
# or with transfrom
transform(df2, l1pm10 = c(tail(pm10, -1), NA), l1pm102 = c(NA, head(pm10, -1)))
#R> var1 pm10 l1pm10 l1pm102
#R> 1 1 26.95607 NA NA
#R> 2 2 NA 32.83869 26.95607
#R> 3 3 32.83869 39.95607 NA
#R> 4 4 39.95607 NA 32.83869
#R> 5 5 NA 40.95607 39.95607
#R> 6 6 40.95607 33.95607 NA
#R> 7 7 33.95607 28.95607 40.95607
#R> 8 8 28.95607 32.34877 33.95607
#R> 9 9 32.34877 NA 28.95607
#R> 10 10 NA NA 32.34877
You can write a general lag function with these two as follows
lag_func <- function(x, k = 1, pad = NA){
if(k == 0)
return(x)
nas <- rep(pad, min(length(x), abs(k)))
if(k < 0)
c(tail(x, k), nas) else c(nas, head(x, -k))
}
# use the function to lag the variable
sapply((-11):11, lag_func, x = df2$pm10)
#R> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
#R> [1,] NA NA NA 32.34877 28.95607 33.95607 40.95607 NA 39.95607
#R> [2,] NA NA NA NA 32.34877 28.95607 33.95607 40.95607 NA
#R> [3,] NA NA NA NA NA 32.34877 28.95607 33.95607 40.95607
#R> [4,] NA NA NA NA NA NA 32.34877 28.95607 33.95607
#R> [5,] NA NA NA NA NA NA NA 32.34877 28.95607
#R> [6,] NA NA NA NA NA NA NA NA 32.34877
#R> [7,] NA NA NA NA NA NA NA NA NA
#R> [8,] NA NA NA NA NA NA NA NA NA
#R> [9,] NA NA NA NA NA NA NA NA NA
#R> [10,] NA NA NA NA NA NA NA NA NA
#R> [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17]
#R> [1,] 32.83869 NA 26.95607 NA NA NA NA NA
#R> [2,] 39.95607 32.83869 NA 26.95607 NA NA NA NA
#R> [3,] NA 39.95607 32.83869 NA 26.95607 NA NA NA
#R> [4,] 40.95607 NA 39.95607 32.83869 NA 26.95607 NA NA
#R> [5,] 33.95607 40.95607 NA 39.95607 32.83869 NA 26.95607 NA
#R> [6,] 28.95607 33.95607 40.95607 NA 39.95607 32.83869 NA 26.95607
#R> [7,] 32.34877 28.95607 33.95607 40.95607 NA 39.95607 32.83869 NA
#R> [8,] NA 32.34877 28.95607 33.95607 40.95607 NA 39.95607 32.83869
#R> [9,] NA NA 32.34877 28.95607 33.95607 40.95607 NA 39.95607
#R> [10,] NA NA NA 32.34877 28.95607 33.95607 40.95607 NA
#R> [,18] [,19] [,20] [,21] [,22] [,23]
#R> [1,] NA NA NA NA NA NA
#R> [2,] NA NA NA NA NA NA
#R> [3,] NA NA NA NA NA NA
#R> [4,] NA NA NA NA NA NA
#R> [5,] NA NA NA NA NA NA
#R> [6,] NA NA NA NA NA NA
#R> [7,] 26.95607 NA NA NA NA NA
#R> [8,] NA 26.95607 NA NA NA NA
#R> [9,] 32.83869 NA 26.95607 NA NA NA
#R> [10,] 39.95607 32.83869 NA 26.95607 NA NA