我想在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
有什么好主意吗?
答案 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)