【问题标题】:How do I lag a data.frame?我如何滞后 data.frame?
【发布时间】:2017-08-16 15:22:51
【问题描述】:

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

有什么好主意吗?

【问题讨论】:

    标签: r dataframe lag shift


    【解决方案1】:

    在基础 R 中非常简单:

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

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


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

    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
    

    【讨论】:

    • 非常感谢您的解释
    【解决方案2】:
    library(dplyr)
    x %>% mutate_all(lag)
    
       a  b
    1 NA NA
    2  1  4
    3  2  5
    

    【讨论】:

    • 你真的需要funs lag吗?
    • 如果 OP 是 R 的新手,这个可能更容易理解:dplyr::mutate_all(x, lag)
    • 谢谢,正是我想要的!
    • 我怎样才能滞后 2 或 3 行?
    • x %&gt;% mutate_all(lag, n = 2)
    【解决方案3】:

    为了完整起见,这类似于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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      • 2021-11-06
      • 2020-04-10
      • 2021-08-21
      • 2023-03-06
      • 2021-06-01
      • 2020-08-25
      相关资源
      最近更新 更多