按天滞后变量并在此过程中创建新行

lagging variables by day and creating new row in the process

我试图按天滞后变量,但许多变量在前一天没有观察到。所以我需要在这个过程中添加一个额外的行。 Dplyr 让我很接近,但我需要一种方法来在此过程中添加一个新行并且有数千个案例。任何想法将不胜感激。

ID<-c(1,1,1,1,2,2)
day<-c(0,1,2,5,1,3)
v<-c(2.2,3.4,1.2,.8,6.4,2)
dat1<-as.data.frame(cbind(ID,day,v))
dat1

  ID day   v
1  1   0 2.2
2  1   1 3.4
3  1   2 1.2
4  1   5 0.8
5  2   1 6.4
6  2   3 2.0

使用 dplyr 让我来到这里:

dat2<-
  dat1 %>%
  group_by(ID) %>%
  mutate(v.L = dplyr::lead(v, n = 1, default = NA))
dat2
     ID   day     v   v.L
1     1     0   2.2   3.4
2     1     1   3.4   1.2
3     1     2   1.2   0.8
4     1     5   0.8    NA
5     2     1   6.4   2.0
6     2     3   2.0    NA

但我需要到达这里:

 ID2<-c(1,1,1,1,1,2,2,2)
 day2<-c(0,1,2,4,5,1,2,3)
 v2<-c(2.2,3.4,1.2,NA,.8,6.4,NA,2)
 v2.L<-c(3.4,1.2,NA,.8,NA,NA,2,NA)
 dat3<-as.data.frame(cbind(ID2,day2,v2,v2.L))
 dat3

   ID2 day2  v2 v2.L
1   1    0 2.2  3.4
2   1    1 3.4  1.2
3   1    2 1.2   NA
4   1    4  NA  0.8
5   1    5 0.8   NA
6   2    1 6.4   NA
7   2    2  NA  2.0
8   2    3 2.0   NA

您可以使用 tidyr 包中的 completefull_seq 来完成天数。您需要在末尾删除 vv.L 中具有 NA 的行:

library(dplyr)
library(tidyr)

dat2 = dat1 %>%
       group_by(ID) %>%
       complete(day = full_seq(day,1)) %>%
       mutate(v.L = lead(v)) %>%
       filter(!(is.na(v) & is.na(v.L)))


    ID   day     v   v.L
  <dbl> <dbl> <dbl> <dbl>
     1     0   2.2   3.4
     1     1   3.4   1.2
     1     2   1.2    NA
     1     4    NA   0.8
     1     5   0.8    NA
     2     1   6.4    NA
     2     2    NA   2.0
     2     3   2.0    NA