我有前三列数据。 yest列表示该ID在前一天做了某件事。我正在尝试通过添加执行以下三项操作的新变量“new”来从dat转换为dat2:

  • 将yest的值复制到前一天。这些日子并不总是连续的。因此,仅当它是实际的前一天(第2天与第3天)时才应复制,而不仅仅是从下一行到上一行。
  • 应该将yest的值复制到具有相同id / day组合的new的所有行
  • 如果每个id /天组合有多个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
    

    最佳答案

    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
    



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

    07-24 17:15