我如何滞后于data.frame?

时间:2017-08-16 15:22:52

标签: r dataframe lag shift

我想在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

有什么好主意吗?

3 个答案:

答案 0 :(得分:3)

基础R非常简单:

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

head,-1表示最后一行,rbind表示NA,因为第一个参数会添加一行NAs。

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

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

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

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

答案 1 :(得分:2)

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

   a  b
1 NA NA
2  1  4
3  2  5

答案 2 :(得分:1)

出于完整性考虑,这类似于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)