具有新行的滞后时间序列
Lag time series with new rows
我想lead/lag变量,但我不想丢分。
例如:
x(xts 对象):
2017-06-30 1
2017-07-31 2
2017-08-31 3
2017-09-30 4
2017-10-31 5
2017-11-30 6
2017-12-31 7
2018-01-31 8
2018-02-28 9
2018-03-31 10
当我做的时候
lag(x,2)
我得到:
2017-06-30 NA
2017-07-31 NA
2017-08-31 1
2017-09-30 2
2017-10-31 3
2017-11-30 4
2017-12-31 5
2018-01-31 6
2018-02-28 7
2018-03-31 8
我在 2018-04-30 输了 9 个,在 2018-05-31 输了 10 个。有没有办法保留它们?我知道查找其他日期(2018-04-30 和 2018-05-31)是个问题,但也许有办法自动完成。
我假设你想用 NA
s 填充你的值,而你以前的值被扩展到新的日期,这又是接下来几个月的最后几天。
如果是这样,这个使用 lubridate
的函数就是这样做的:
dpad <- function(x,n){
require(lubridate)
d <- as.character(ymd(x[nrow(x),1]) + 1 + months(1:n) -1)
return(cbind(c(x[,1],d),c(rep(NA,n),x[,2])))
}
在这种情况下,x
应该是一个 2 列对象,具有第一列日期和第二列值。 n
指定追加到开头的 NA
的数量:
dpad(x, 2)
# [,1] [,2]
# [1,] "2017-06-30" NA
# [2,] "2017-07-31" NA
# [3,] "2017-08-31" "1"
# [4,] "2017-09-30" "2"
# [5,] "2017-10-31" "3"
# [6,] "2017-11-30" "4"
# [7,] "2017-12-31" "5"
# [8,] "2018-01-31" "6"
# [9,] "2018-02-28" "7"
# [10,] "2018-03-31" "8"
# [11,] "2018-04-30" "9"
# [12,] "2018-05-31" "10"
有点长篇大论,但这样就可以了。这需要 dplyr
和 magrittr
.
# Original data frame
df <- data.frame(date = seq(as.Date("2017-07-01"), length=10, by="1 month") - 1, n = 1:10)
# date n
# 1 2017-06-30 1
# 2 2017-07-31 2
# 3 2017-08-31 3
# 4 2017-09-30 4
# 5 2017-10-31 5
# 6 2017-11-30 6
# 7 2017-12-31 7
# 8 2018-01-31 8
# 9 2018-02-28 9
# 10 2018-03-31 10
接下来,我定义滞后长度:
# Length of lag
lag_length <- 2
在这里,我创建了要添加的额外行:
# Extra rows to add
extra <- data.frame(date = (seq(tail(df$date, 1) + 1, length = lag_length + 1, by = "1 month") - 1)[-1], n = NA)
最后,我将它们绑定到原始数据框并滞后变量 n
:
# Bind extra rows and lag 'n' by 'lag_length'
df %<>%
bind_rows(extra) %>%
mutate(n = lag(n, lag_length))
# New data frame
# date n
# 1 2017-06-30 NA
# 2 2017-07-31 NA
# 3 2017-08-31 1
# 4 2017-09-30 2
# 5 2017-10-31 3
# 6 2017-11-30 4
# 7 2017-12-31 5
# 8 2018-01-31 6
# 9 2018-02-28 7
# 10 2018-03-31 8
# 11 2018-04-30 9
# 12 2018-05-31 10
我想lead/lag变量,但我不想丢分。
例如: x(xts 对象):
2017-06-30 1
2017-07-31 2
2017-08-31 3
2017-09-30 4
2017-10-31 5
2017-11-30 6
2017-12-31 7
2018-01-31 8
2018-02-28 9
2018-03-31 10
当我做的时候
lag(x,2)
我得到:
2017-06-30 NA
2017-07-31 NA
2017-08-31 1
2017-09-30 2
2017-10-31 3
2017-11-30 4
2017-12-31 5
2018-01-31 6
2018-02-28 7
2018-03-31 8
我在 2018-04-30 输了 9 个,在 2018-05-31 输了 10 个。有没有办法保留它们?我知道查找其他日期(2018-04-30 和 2018-05-31)是个问题,但也许有办法自动完成。
我假设你想用 NA
s 填充你的值,而你以前的值被扩展到新的日期,这又是接下来几个月的最后几天。
如果是这样,这个使用 lubridate
的函数就是这样做的:
dpad <- function(x,n){
require(lubridate)
d <- as.character(ymd(x[nrow(x),1]) + 1 + months(1:n) -1)
return(cbind(c(x[,1],d),c(rep(NA,n),x[,2])))
}
在这种情况下,x
应该是一个 2 列对象,具有第一列日期和第二列值。 n
指定追加到开头的 NA
的数量:
dpad(x, 2)
# [,1] [,2]
# [1,] "2017-06-30" NA
# [2,] "2017-07-31" NA
# [3,] "2017-08-31" "1"
# [4,] "2017-09-30" "2"
# [5,] "2017-10-31" "3"
# [6,] "2017-11-30" "4"
# [7,] "2017-12-31" "5"
# [8,] "2018-01-31" "6"
# [9,] "2018-02-28" "7"
# [10,] "2018-03-31" "8"
# [11,] "2018-04-30" "9"
# [12,] "2018-05-31" "10"
有点长篇大论,但这样就可以了。这需要 dplyr
和 magrittr
.
# Original data frame
df <- data.frame(date = seq(as.Date("2017-07-01"), length=10, by="1 month") - 1, n = 1:10)
# date n
# 1 2017-06-30 1
# 2 2017-07-31 2
# 3 2017-08-31 3
# 4 2017-09-30 4
# 5 2017-10-31 5
# 6 2017-11-30 6
# 7 2017-12-31 7
# 8 2018-01-31 8
# 9 2018-02-28 9
# 10 2018-03-31 10
接下来,我定义滞后长度:
# Length of lag
lag_length <- 2
在这里,我创建了要添加的额外行:
# Extra rows to add
extra <- data.frame(date = (seq(tail(df$date, 1) + 1, length = lag_length + 1, by = "1 month") - 1)[-1], n = NA)
最后,我将它们绑定到原始数据框并滞后变量 n
:
# Bind extra rows and lag 'n' by 'lag_length'
df %<>%
bind_rows(extra) %>%
mutate(n = lag(n, lag_length))
# New data frame
# date n
# 1 2017-06-30 NA
# 2 2017-07-31 NA
# 3 2017-08-31 1
# 4 2017-09-30 2
# 5 2017-10-31 3
# 6 2017-11-30 4
# 7 2017-12-31 5
# 8 2018-01-31 6
# 9 2018-02-28 7
# 10 2018-03-31 8
# 11 2018-04-30 9
# 12 2018-05-31 10