R 滞后、平均和替换变量

R 滞后、平均和替换变量,r,replace,lag,R,Replace,Lag,我有前三列数据。yest列表示id在前一天做了一些事情。我试图通过添加一个新变量“new”从dat转到dat2,该变量有三个功能: 将yest的值复制到前一天。然而,这些日子并不总是连续的。因此,仅当它是实际的前一行(第2天对第3天)时,才应该进行复制,而不仅仅是从下一行复制到上一行 yest的值应复制到具有相同id/天组合的所有新行 如果有多个yest per id/day组合值,则应在填充新变量之前对其进行平均 我一直在尝试不同的ifelse和merge组合,但都失败得很惨。在此方面的任何帮

我有前三列数据。yest列表示id在前一天做了一些事情。我试图通过添加一个新变量“new”从dat转到dat2,该变量有三个功能:

  • 将yest的值复制到前一天。然而,这些日子并不总是连续的。因此,仅当它是实际的前一行(第2天对第3天)时,才应该进行复制,而不仅仅是从下一行复制到上一行

  • yest的值应复制到具有相同id/天组合的所有新行

  • 如果有多个yest per id/day组合值,则应在填充新变量之前对其进行平均

  • 我一直在尝试不同的ifelse和merge组合,但都失败得很惨。在此方面的任何帮助都将不胜感激

        id<-c(1,1,1,1,1,3,3,3,3,3,3,3,8,8,8,8,8)
        day<-c(1,2,2,3,5,0,1,2,3,4,5,5,0,3,4,4,5)
        yest<-c(NA,1,3,NA,NA,1,2,NA,NA,NA,3,NA,NA,NA,NA,3,4)
        dat<-cbind(id,day,yest)
        dat
              id day yest
         [1,]  1   1   NA
         [2,]  1   2    1
         [3,]  1   2    3
         [4,]  1   3   NA
         [5,]  1   5   NA
         [6,]  3   0    1
         [7,]  3   1    2
         [8,]  3   2   NA
         [9,]  3   3   NA
        [10,]  3   4   NA
        [11,]  3   5    3
        [12,]  3   5   NA
        [13,]  8   0   NA
        [14,]  8   3   NA
        [15,]  8   4   NA
        [16,]  8   4    3
        [17,]  8   5    4
    
        new<-c(2,NA,NA,NA,NA,2,NA,NA,NA,3,NA,NA,NA,3,4,4,NA)
        dat2<-cbind(dat,new)
        dat2
    
                 id day yest new
            [1,]  1   1   NA   2
            [2,]  1   2    1  NA
            [3,]  1   2    3  NA
            [4,]  1   3   NA  NA
            [5,]  1   5   NA  NA
            [6,]  3   0    1   2
            [7,]  3   1    2  NA
            [8,]  3   2   NA  NA
            [9,]  3   3   NA  NA
           [10,]  3   4   NA   3
           [11,]  3   5    3  NA
           [12,]  3   5   NA  NA
           [13,]  8   0   NA  NA
           [14,]  8   3   NA   3
           [15,]  8   4   NA   4
           [16,]  8   4    3   4
           [17,]  8   5    4  NA
    
    id
    
    library(dplyr)
    
    df <- data.frame(
      id = c(1,1,1,1,1,3,3,3,3,3,3,3,8,8,8,8,8),
      day = c(1,2,2,3,5,0,1,2,3,4,5,5,0,3,4,4,5),
      yest = c(NA,1,3,NA,NA,1,2,NA,NA,NA,3,NA,NA,NA,NA,3,4)
      ) 
    
    df_lag <- df %>% 
      group_by(id, day) %>% 
      summarise(new = mean(yest, na.rm = T)) %>% 
      ungroup() %>% 
      mutate(day = day-1)
    
    df_lag
    
    # A tibble: 14 x 3
          id   day   new
       <dbl> <dbl> <dbl>
     1     1     0   NaN
     2     1     1     2
     3     1     2   NaN
     4     1     4   NaN
     5     3    -1     1
     6     3     0     2
     7     3     1   NaN
     8     3     2   NaN
     9     3     3   NaN
    10     3     4     3
    11     8    -1   NaN
    12     8     2   NaN
    13     8     3     3
    14     8     4     4
    
    left_join(df, df_lag)
    
       id day yest new
    1   1   1   NA   2
    2   1   2    1 NaN
    3   1   2    3 NaN
    4   1   3   NA  NA
    5   1   5   NA  NA
    6   3   0    1   2
    7   3   1    2 NaN
    8   3   2   NA NaN
    9   3   3   NA NaN
    10  3   4   NA   3
    11  3   5    3  NA
    12  3   5   NA  NA
    13  8   0   NA  NA
    14  8   3   NA   3
    15  8   4   NA   4
    16  8   4    3   4
    17  8   5    4  NA