R向量/数据帧中的基本滞后

Bti*_*rt3 35 r time-series zoo xts

很可能会暴露我是R的新手,但在SPSS中,运行滞后非常容易.显然这是用户错误,但我缺少什么?

x <- sample(c(1:9), 10, replace = T)
y <- lag(x, 1)
ds <- cbind(x, y)
ds
Run Code Online (Sandbox Code Playgroud)

结果是:

      x y
 [1,] 4 4
 [2,] 6 6
 [3,] 3 3
 [4,] 4 4
 [5,] 3 3
 [6,] 5 5
 [7,] 8 8
 [8,] 9 9
 [9,] 3 3
[10,] 7 7
Run Code Online (Sandbox Code Playgroud)

我想我会看到:

     x y
 [1,] 4 
 [2,] 6 4
 [3,] 3 6
 [4,] 4 3
 [5,] 3 4
 [6,] 5 3
 [7,] 8 5
 [8,] 9 8
 [9,] 3 9
[10,] 7 3
Run Code Online (Sandbox Code Playgroud)

任何指导将不胜感激.

Rei*_*son 27

解决这个问题的另一种方法是使用zoo包,它有一个lag方法,用NA填充结果:

require(zoo)
> set.seed(123)
> x <- zoo(sample(c(1:9), 10, replace = T))
> y <- lag(x, -1, na.pad = TRUE)
> cbind(x, y)
   x  y
1  3 NA
2  8  3
3  4  8
4  8  4
5  9  8
6  1  9
7  5  1
8  9  5
9  5  9
10 5  5
Run Code Online (Sandbox Code Playgroud)

结果是一个多变量动物园对象(它是一个增强矩阵),但很容易转换为data.frame via

> data.frame(cbind(x, y))
Run Code Online (Sandbox Code Playgroud)

  • 另请注意,如果z是动物园系列,那么滞后(z,0:-1)是一个两列动物园系列,包含原始系列和滞后系列.此外,coredata(z)将仅返回动物园系列的数据部分,as.data.frame(z)将返回一个数据框,其中z的数据部分作为列内容. (2认同)

And*_*rew 26

我有同样的问题,但我不想使用zoo或xts,所以我为数据框写了一个简单的滞后函数:

lagpad <- function(x, k) {
  if (k>0) {
    return (c(rep(NA, k), x)[1 : length(x)] );
  }
  else {
    return (c(x[(-k+1) : length(x)], rep(NA, -k)));
  }
}
Run Code Online (Sandbox Code Playgroud)

这可能会向前或向后延迟:

x<-1:3;
(cbind(x, lagpad(x, 1), lagpad(x,-1)))
     x      
[1,] 1 NA  2
[2,] 2  1  3
[3,] 3  2 NA
Run Code Online (Sandbox Code Playgroud)


Jos*_*ich 15

lag不会移动数据,它只会改变"时基". x没有"时间基准",所以cbind不能按预期工作.尝试cbind(as.ts(x),lag(x))并注意到1的"滞后"会使周期向前移动.

我建议使用zoo/ xts用于时间序列.的zoo小插曲是特别有帮助.

  • `install.packages("xts")#这将安装动物园` (2认同)

zwo*_*wol 7

lag()适用于时间序列,而您正在尝试使用裸矩阵. 这个老问题建议embed改为使用,如下:

lagmatrix <- function(x,max.lag) embed(c(rep(NA,max.lag), x), max.lag+1)
Run Code Online (Sandbox Code Playgroud)

例如

> x
[1] 8 2 3 9 8 5 6 8 5 8
> lagmatrix(x, 1)
      [,1] [,2]
 [1,]    8   NA
 [2,]    2    8
 [3,]    3    2
 [4,]    9    3
 [5,]    8    9
 [6,]    5    8
 [7,]    6    5
 [8,]    8    6
 [9,]    5    8
[10,]    8    5
Run Code Online (Sandbox Code Playgroud)


mat*_*jay 6

现在对我来说最简单的方法如下:

require(dplyr)
df <- data.frame(x = sample(c(1:9), 10, replace = T))
df <- df %>% mutate(y = lag(x))
Run Code Online (Sandbox Code Playgroud)


小智 5

仅使用标准R函数,就可以通过更简单的方式实现:

x <- sample(c(1:9), 10, replace = T)
y <- c(NA, head(x, -1))
ds <- cbind(x, y)
ds
Run Code Online (Sandbox Code Playgroud)