我如何滞后 data.frame?

How do I lag a data.frame?

我想在 R 中延迟整个数据帧。

在python中,很容易做到这一点,使用shift()函数 (例如:df.shift(1)

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

我该怎么做?

> 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

我想要的是,

> lag(x,1)
> 
  a b
1 NA NA
2 1 4
3 2 5

有什么好主意吗?

library(dplyr)
x %>% mutate_all(lag)

   a  b
1 NA NA
2  1  4
3  2  5

在基础 R 中非常简单:

rbind(NA, head(x, -1))
   a  b
1 NA NA
2  1  4
3  2  5

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


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

x[c(NA, 1:(nrow(x)-1)),]
    a  b
NA NA NA
1   1  4
2   2  5

这在第一个变量的行名中留下一个NA,对于"fix"这个,你可以去掉data.frame class然后重新赋值:

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

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

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

甚至将其放入函数中

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

试试看

myLag(x, 2)
   a  b
1 NA NA
2 NA NA
3  1  4

为了完整起见,这类似于 zoo 的实现方式(但对于 data.frame,因为 zoo lag(...) 方法不适用于 data.frame对象):

lag.df <- function(x, lag) {
  if (lag < 0)
    rbind(NA, head(x, lag))
  else
    rbind(tail(x, -lag), NA)
}

并像这样使用:

x <- data.frame(dt=c(as.Date('2019-01-01'), as.Date('2019-01-02'), as.Date('2019-01-03')), a=c(1,2,3),b=c(4,5,6))
lag.df(x, -1)
lag.df(x, 1)

或者您可以只使用动物园:

library(zoo)
x <- data.frame(dt=c(as.Date('2019-01-01'), as.Date('2019-01-02'), as.Date('2019-01-03')), a=c(1,2,3),b=c(4,5,6))
x.zoo <- read.zoo(x) 
lag(x.zoo, -1)
lag(x.zoo, 1)