【问题标题】:Fill NA until certain date based on different column per group根据每组不同的列填写 NA 直到特定日期
【发布时间】:2023-01-25 20:59:13
【问题描述】:

我有以下数据框 df(dput 下面):

   group      date1      date2 value
1      A 2022-01-01 2022-01-07    NA
2      A 2022-01-02 2022-01-07     1
3      A 2022-01-04 2022-01-07    NA
4      A 2022-01-10 2022-01-07    NA
5      B 2022-01-01 2022-01-06     3
6      B 2022-01-03 2022-01-06    NA
7      B 2022-01-04 2022-01-06    NA
8      B 2022-01-06 2022-01-06    NA
9      C 2022-01-01 2022-01-09    NA
10     C 2022-01-03 2022-01-09    NA
11     C 2022-01-04 2022-01-09     2
12     C 2022-01-11 2022-01-09    NA

我想在 date2 之前填写每组的 NA 值。因此,如果 date1 较小,则应填充第一行(值为 1 的 A 组)之后的所有 NA 值,直到 date2。这是所需的输出:

   group      date1      date2 value
1      A 2022-01-01 2022-01-07    NA
2      A 2022-01-02 2022-01-07     1
3      A 2022-01-04 2022-01-07     1
4      A 2022-01-10 2022-01-07    NA
5      B 2022-01-01 2022-01-06     3
6      B 2022-01-03 2022-01-06     3
7      B 2022-01-04 2022-01-06     3
8      B 2022-01-06 2022-01-06     3
9      C 2022-01-01 2022-01-09    NA
10     C 2022-01-03 2022-01-09    NA
11     C 2022-01-04 2022-01-09     2
12     C 2022-01-11 2022-01-09    NA

正如您在 A 组中看到的那样,只有下一行填充了 1,因为最后一个日期 1 在日期 2 之后。所以我想知道是否有人知道如何根据每个组的特定日期填写 NA?


dputdf:

df<-structure(list(group = c("A", "A", "A", "A", "B", "B", "B", "B", 
"C", "C", "C", "C"), date1 = c("2022-01-01", "2022-01-02", "2022-01-04", 
"2022-01-10", "2022-01-01", "2022-01-03", "2022-01-04", "2022-01-06", 
"2022-01-01", "2022-01-03", "2022-01-04", "2022-01-11"), date2 = c("2022-01-07", 
"2022-01-07", "2022-01-07", "2022-01-07", "2022-01-06", "2022-01-06", 
"2022-01-06", "2022-01-06", "2022-01-09", "2022-01-09", "2022-01-09", 
"2022-01-09"), value = c(NA, 1, NA, NA, 3, NA, NA, NA, NA, NA, 
2, NA)), class = "data.frame", row.names = c(NA, -12L))

【问题讨论】:

    标签: r dataframe fill


    【解决方案1】:

    创建一个额外的组并使用fill

    library(dplyr)
    library(tidyr)
    df %>% 
      group_by(group, after = date1 > date2) %>% 
      fill(value) %>% 
      ungroup() %>% 
      select(-after)
    
    # A tibble: 12 × 4
       group date1      date2      value
       <chr> <chr>      <chr>      <dbl>
     1 A     2022-01-01 2022-01-07    NA
     2 A     2022-01-02 2022-01-07     1
     3 A     2022-01-04 2022-01-07     1
     4 A     2022-01-10 2022-01-07    NA
     5 B     2022-01-01 2022-01-06     3
     6 B     2022-01-03 2022-01-06     3
     7 B     2022-01-04 2022-01-06     3
     8 B     2022-01-06 2022-01-06     3
     9 C     2022-01-01 2022-01-09    NA
    10 C     2022-01-03 2022-01-09    NA
    11 C     2022-01-04 2022-01-09     2
    12 C     2022-01-11 2022-01-09    NA
    

    【讨论】:

      【解决方案2】:

      使用数据表

      library(data.table)                                                                                                                                                    
      
      setDT(df)[as.Date(date1) <= as.Date(date2), value := nafill(value, type = "locf"), group]
      

      结果

          group      date1      date2 value
       1:     A 2022-01-01 2022-01-07    NA
       2:     A 2022-01-02 2022-01-07     1
       3:     A 2022-01-04 2022-01-07     1
       4:     A 2022-01-10 2022-01-07    NA
       5:     B 2022-01-01 2022-01-06     3
       6:     B 2022-01-03 2022-01-06     3
       7:     B 2022-01-04 2022-01-06     3
       8:     B 2022-01-06 2022-01-06     3
       9:     C 2022-01-01 2022-01-09    NA
      10:     C 2022-01-03 2022-01-09    NA
      11:     C 2022-01-04 2022-01-09     2
      12:     C 2022-01-11 2022-01-09    NA
      

      【讨论】:

        猜你喜欢
        • 2020-03-27
        • 2017-09-16
        • 2016-07-31
        • 2015-01-28
        • 2015-11-09
        • 1970-01-01
        • 2015-07-09
        • 1970-01-01
        相关资源
        最近更新 更多