我如何滞后 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)
我想在 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)