滞后、平均和替换变量

lagging, averaging, and replacing variables

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

  1. 将yest的值复制到前一天。虽然日子并不总是连续的。所以它应该只复制它是否是实际的前一行(第 2 天与第 3 天),而不仅仅是从下一行到上一行。

  2. 应该将 yest 的值复制到具有相同 id / day 组合的所有新行

  3. 如果 yest per id / day combo 的值超过一个,则应在填充新变量之前对其进行平均。

我一直在尝试不同的 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
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)
  ) 

首先,您为 dayid 的每个组合创建一个组。然后你取 yest 的平均值,确保扔掉 NA。然后从 day 中减去 1,以便将其与原始数据中的正确日期相匹配。

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

在这里,您可以通过 dayid 加入他们,使用 left_join 来排除没有的日子t a day in the original dataset (i.e. -1 in lines 5 and 11).

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