R在不平衡时间序列数据框中创建滞后变量

R create lag variable in unbalance time series dataframe

我想在我的数据框中创建一个滞后变量。

我有一份时间清单c("20110127", "20110128", "20110129", "20110130", "20110131", "20110201", "20110202")

我的数据框看起来像:

ID TIME VALUE
1 20110127 3.23
1 20110128 4.57
1 20110130 3.22
1 20110131 4.33
1 20110202 5.23
2 20110127 0.86
2 20110128 7.55
2 20110129 1.24
2 20110201 3.69

table 中的年份不是连续的。我想 group_by ID 然后创建一个一天的滞后变量。看起来像这样:

ID TIME VALUE LAG
1 20110127 3.23 NA
1 20110128 4.57 3.23
1 20110130 3.22 NA
1 20110131 4.33 3.22
1 20110201 1.22 4.33
1 20110202 5.23 1.22
2 20110127 0.86 NA
2 20110128 7.55 0.86
2 20110129 1.24 7.55
2 20110201 3.69 NA

我试过了

alltime = c("20110127", "20110128", "20110129", "20110130", "20110131", "20110201", "20110202")

last_day = data %>%
    arrange(ID, TIME) %>%
    group_by(ID) %>%
    mutate(lagtime = alltime[which(alltime == TIME)+1], lagoutput = value ,value = NULL)
data %>%
    left_join(last_day)

但 mutate 函数似乎在这里不起作用。可能是 alltime[which(alltime == TIME)+1] 的问题,我无法创建延迟。

感谢任何评论。

我们可以使用 ifelse 语句。因此,如果行相隔 1 天(这里我使用 lubridate 转换为时间格式),则 return lag value 如果不是 return NA.

library(tidyverse)
library(lubridate)

df %>%
  arrange(ID, TIME) %>%
  group_by(ID) %>%
  mutate(LAG = ifelse(ymd(TIME) - lag(ymd(TIME)) == 1, lag(VALUE), NA))

输出

      ID     TIME VALUE   LAG
   <int>    <int> <dbl> <dbl>
 1     1 20110127  3.23 NA   
 2     1 20110128  4.57  3.23
 3     1 20110130  3.22 NA   
 4     1 20110131  4.33  3.22
 5     1 20110201  1.22  4.33
 6     1 20110202  5.23  1.22
 7     2 20110127  0.86 NA   
 8     2 20110128  7.55  0.86
 9     2 20110129  1.24  7.55
10     2 20110201  3.69 NA   

数据

structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), 
    TIME = c(20110127L, 20110128L, 20110130L, 20110131L, 20110201L, 
    20110202L, 20110127L, 20110128L, 20110129L, 20110201L), VALUE = c(3.23, 
    4.57, 3.22, 4.33, 1.22, 5.23, 0.86, 7.55, 1.24, 3.69)), class = "data.frame", row.names = c(NA, 
-10L))

您可以使用 diff()lubridate::ymd() 来制作一个临时列,指示日期中是否存在间隔;然后利用该差距获得 VALUE

的条件滞后
data %>%
  group_by(ID) %>% 
  mutate(g = c(0,diff(lubridate::ymd(TIME))),
         LAG = if_else(g==1,lag(VALUE),as.double(NA))) %>% 
  select(-g)

输出:

     ID     TIME VALUE   LAG
  <int>    <int> <dbl> <dbl>
1     1 20110127  3.23 NA   
2     1 20110128  4.57  3.23
3     1 20110130  3.22 NA   
4     1 20110131  4.33  3.22
5     1 20110202  5.23 NA   
6     2 20110127  0.86 NA   
7     2 20110128  7.55  0.86
8     2 20110129  1.24  7.55
9     2 20110201  3.69 NA