对于R向量/数据帧,滞后的相反功能是什么?

时间:2015-02-10 13:13:30

标签: r time-series lag lead

我在处理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

4 个答案:

答案 0 :(得分:9)

内置'导联'功能怎么样? (来自dplyr包) 它不完全符合艾哈迈德的职能吗?

cbind(x, lead(y, 1))

如果你想在同一个函数中计算正滞后或负滞后,我建议他''shift'函数的“更短”版本:

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}替代)。

答案 1 :(得分:3)

有一种更简单的方法可以完全从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的函数,其中包含两个参数;一个是你需要操作滞后/导线的矢量,另一个是你需要的滞后/导线数量。

示例:

假设您有以下向量:

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

答案 2 :(得分:0)

更简单的解决方案:

y = dplyr::lead(y,1)

答案 3 :(得分:0)

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