滞后,平均和替换变量

时间:2017-09-20 21:57:26

标签: r replace lag

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

  1. 将yest的值复制到前一天。但这些日子并不总是连续的。因此它只应复制,如果它是实际的前一个(第2天与第3天),而不仅仅是从下一行到上一行。

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

  3. 如果每个id / day组合中有多个yest值,则应在填充新变量之前对它们进行平均。

  4. 我一直在尝试不同的ifelse并合并失败的组合。对此有任何帮助将非常感激。

        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
    

1 个答案:

答案 0 :(得分:5)

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)
  ) 

首先,您为 ID 的每个组合创建一个组。然后你采取 yest 的平均值,确保抛弃NA。然后从中减去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

在这里,您可以通过 ID 加入他们,使用left_join来排除没有天的日子在原始数据集中(即第5行和第11行中的-1)。

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