如何滞后data.frame?

问题描述:

我想滞后整个数据帧中R.如何滞后data.frame?

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

但是,我找不到任何一个易于和简单的方法在大熊猫shift()在R.

我该怎么做?

> 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 
+1

你真的需要''上lag' funs'? – PoGibas

+0

不,你说得很对。我会解决这个问题。 – Lyngbakr

+0

如果OP是R的新手,可能会更容易理解:'dplyr :: mutate_all(x,lag)' – PoGibas

基础R相当简单:

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

head与作为第一个参数的NA增加一排-1滴最终行和rbind与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 
+0

非常感谢您的好评 –