【问题标题】:lagging, averaging, and replacing variables滞后、平均和替换变量
【发布时间】:2025-12-28 18:45:06
【问题描述】:

我有前三列数据。 yest 列表示 id 在前一天做了某事。我试图通过添加一个执行三件事的新变量“new”来从 dat 转到 dat2:

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

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

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

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

【问题讨论】:

    标签: r replace lag


    【解决方案1】:
    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 排除没有 day 的日子在原始数据集中(即第 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
    

    【讨论】: