R-新行的滞后时间序列



我想领导/滞后变量,但我不想失去任何积分。

例如: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(是一个问题,但也许有一种方法可以自动完成。

有点刺激,但这可以完成工作。这需要dplyrmagrittr

# 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

我假设您想用 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列对象,其中1列日期和第二列值。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"

最新更新