滞后于 R vector/dataframe 的相反函数是什么?

What's the opposite function to lag for an R vector/dataframe?

我在处理 R 中的时间序列时遇到问题。

#--------------read data

wb = loadWorkbook("Countries_Europe_Prices.xlsx") 
df = readWorksheet(wb, sheet="Sheet2")

x <- df$Year
y <- df$Index1

y <- lag(y, 1, na.pad = TRUE)
cbind(x, y)

它给我以下输出:

        x     y
 [1,] 1974    NA
 [2,] 1975  50.8
 [3,] 1976  51.9
 [4,] 1977  54.8
 [5,] 1978  58.8
 [6,] 1979  64.0
 [7,] 1980  68.8
 [8,] 1981  73.6
 [9,] 1982  74.3
[10,] 1983  74.5
[11,] 1984  72.9
[12,] 1985  72.1
[13,] 1986  72.3
[14,] 1987  71.7
[15,] 1988  72.9
[16,] 1989  75.3
[17,] 1990  81.2
[18,] 1991  84.3
[19,] 1992  87.2
[20,] 1993  90.1

但我希望 y 中的第一个值是 50.8 等等。换句话说,我想要一个负滞后。不懂,怎么办?

我的问题和这个问题很相似,但是我无法解决。我想我还是不明白解决方案...

Basic lag in R vector/dataframe

我从 this link 中完全掌握了一种更简单的方法。我将在这里做的是解释你应该按步骤做什么:

首先通过运行以下代码创建以下函数:

shift<-function(x,shift_by){
    stopifnot(is.numeric(shift_by))
    stopifnot(is.numeric(x))

    if (length(shift_by)>1)
        return(sapply(shift_by,shift, x=x))

    out<-NULL
    abs_shift_by=abs(shift_by)
    if (shift_by > 0 )
        out<-c(tail(x,-abs_shift_by),rep(NA,abs_shift_by))
    else if (shift_by < 0 )
        out<-c(rep(NA,abs_shift_by), head(x,-abs_shift_by))
    else
        out<-x
    out
}

这将创建一个带有两个参数的名为 shift 的函数;一个是您需要操作其 lag/lead 的矢量,另一个是您需要的 lags/leads 个数。

示例:

假设您有以下向量:

x<-seq(1:10)

x
 [1]  1  2  3  4  5  6  7  8  9 10

如果你需要x的一阶滞后

shift(x,-1)
[1] NA  1  2  3  4  5  6  7  8  9 

如果你需要x的一阶领先(负滞后)

shift(x,1)
[1]  2  3  4  5  6  7  8  9 10 NA

内置的'lead'功能怎么样? (来自 dplyr 包) 它不完全符合 Ahmed 的功能吗?

cbind(x, lead(y, 1))

如果您希望能够在同一函数中计算正滞后或负滞后,我建议使用他的 'shift' 函数的 'shorter' 版本:

shift = function(x, lag) {
  require(dplyr)
  switch(sign(lag)/2+1.5, lead(x, abs(lag)), lag(x, abs(lag)))
}

它所做的是创建 2 个案例,一个滞后,另一个领先,并根据滞后的符号选择一个案例(+1.5 是将 {-1, +1} 转换为的技巧{1, 2} 备选方案)。

更简单的解决方案:

y = dplyr::lead(y,1)

lag()函数的反义词是lead()