滞后,平均和替换变量

swh*_*sky 2 replace r lag

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

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

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

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

我一直在尝试不同的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
Run Code Online (Sandbox Code Playgroud)

Bri*_*ian 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)
  ) 
Run Code Online (Sandbox Code Playgroud)

首先,为每天id的组合创建一个组.然后你把平均yest,确保抛出的NAS.然后从日中减去1,这样您就可以将其与原始数据中的正确日期相匹配.

df_lag <- df %>% 
  group_by(id, day) %>% 
  summarise(new = mean(yest, na.rm = T)) %>% 
  ungroup() %>% 
  mutate(day = day-1)

df_lag
Run Code Online (Sandbox Code Playgroud)
# 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
Run Code Online (Sandbox Code Playgroud)

在这里,你将加入他们的一天ID,使用left_join抛出了天那里是没有一天在原始数据集(即-1线5和11).

left_join(df, df_lag)
Run Code Online (Sandbox Code Playgroud)
   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
Run Code Online (Sandbox Code Playgroud)