滞后于 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()
我在处理 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()