我如何滞后一个 data.frame?

Woo*_*Lee 4 r shift lag dataframe

我想在 R 中滞后整个数据帧。

在Python中,这是很容易做到这一点,利用shift()功能(例如:df.shift(1)

但是,我找不到像shift()R中的 Pandas那样简单易行的方法。

我怎样才能做到这一点?

> x = data.frame(a=c(1,2,3),b=c(4,5,6))
> x
  a b
1 1 4
2 2 5
3 3 6
Run Code Online (Sandbox Code Playgroud)

我想要的是,

> lag(x,1)
> 
  a b
1 NA NA
2 1 4
3 2 5
Run Code Online (Sandbox Code Playgroud)

有什么好主意吗?

lmo*_*lmo 6

在基础 R 中非常简单:

rbind(NA, head(x, -1))
   a  b
1 NA NA
2  1  4
3  2  5
Run Code Online (Sandbox Code Playgroud)

head使用 -1 删除最后一行,rbind使用 NA 作为第一个参数添加一行 NA。


您还可以使用行索引[,像这样

x[c(NA, 1:(nrow(x)-1)),]
    a  b
NA NA NA
1   1  4
2   2  5
Run Code Online (Sandbox Code Playgroud)

这会在第一个变量的行名中留下一个 NA,为了“修复”这个,你可以剥离 data.frame 类,然后重新分配它:

data.frame(unclass(x[c(NA, 1:(nrow(x)-1)),]))
   a  b
1 NA NA
2  1  4
3  2  5
Run Code Online (Sandbox Code Playgroud)

在这里,您可以使用rep产生所需的滞后

data.frame(unclass(x[c(rep(NA, 2), 1:(nrow(x)-2)),]))
   a  b
1 NA NA
2 NA NA
3  1  4
Run Code Online (Sandbox Code Playgroud)

甚至把它放到一个函数中

myLag <- function(dat, lag) data.frame(unclass(dat[c(rep(NA, lag), 1:(nrow(dat)-lag)),]))
Run Code Online (Sandbox Code Playgroud)

试一试

myLag(x, 2)
   a  b
1 NA NA
2 NA NA
3  1  4
Run Code Online (Sandbox Code Playgroud)