【问题标题】:What's the opposite function to lag for an R vector/dataframe?滞后的函数是什么才能延迟R向量/ DataFrame?
【发布时间】:2015-04-10 12:57:43
【问题描述】:

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

【问题讨论】:

  • 你能输入你的 y 向量吗?
  • 另一个选择当然是y &lt;- c(y[-1], NA)
  • 什么是dput? @jbaums 哇,这真的是解决我问题的简单方法!太感谢了! :)
  • 作为参考,y[-1] 删除了y 的第一个元素,c 将其参数组合成一个向量。此外,dput 返回对象的结构(例如dput(df)),将来提供此结构将帮助我们重现您的问题 - 请参阅?dput
  • 好的,完美!非常感谢。如果我想保留第一个元素(不是 NA 值),如何继续?向量的长度可能会有问题...?

标签: r time-series lag lead


【解决方案1】:

内置的'lead'功能怎么样? (来自 dplyr 包) 它不正是完成了艾哈迈德的职能吗?

cbind(x, lead(y, 1))

如果您希望能够在同一函数中计算正滞后或负滞后,我建议使用他的“移位”函数的“更短”版本:

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

【讨论】:

  • 我稍后会尝试这个解决方案。没有考虑 dplyr 包。谢谢!
  • 完美解决方案!真的!非常感谢你们所有人:)
【解决方案2】:

我从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

【讨论】:

  • 知道'lead'函数吗?
  • @agenis 刚刚检查过。它与上面的函数shift 一样(仅用于正面部分)。负面的部分应该由通常的lag函数来完成。
  • 如何“按组”应用移位功能?因为我不希望第一条记录引用前一组?
【解决方案3】:

更简单的解决方案:

y = dplyr::lead(y,1)

【讨论】:

    【解决方案4】:

    lag()函数的反面是lead()

    【讨论】:

    • 如果你的答案太短,你可以像评论一样发送。
    猜你喜欢
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多