我在处理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,依此类推。换句话说,我希望得到负滞后。我不明白,我该怎么做?
我的问题与这个问题非常相似,但是我无法解决。我想我仍然不明白解决方案...
答案 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()