【问题标题】:fill a specific amount of rows of data.table with previous value用先前的值填充特定数量的 data.table 行
【发布时间】:2018-09-09 13:36:12
【问题描述】:

我现在有一个问题。 我试图操作的列如下所示:

> DT <- data.table(Group= c("SM", NA, NA, NA, NA, NA, "GH", NA, NA, NA, NA, NA, NA, NA))
> DT
    Group
 1:    SM
 2:  <NA>
 3:  <NA>
 4:  <NA>
 5:  <NA>
 6:  <NA>
 7:    GH
 8:  <NA>
 9:  <NA>
10:  <NA>
11:  <NA>
12:  <NA>
13:  <NA>
14:  <NA>

我想用以前的值填充 NA,但只是针对特定数量的行,在本例中只有 4,这意味着所需的结果是:

    Group
 1:    SM
 2:    SM
 3:    SM
 4:    SM
 5:    SM
 6:  <NA>
 7:    GH
 8:    GH
 9:    GH
10:    GH
11:    GH
12:  <NA>
13:  <NA>
14:  <NA>

我怎样才能做到这一点?我尝试使用 na.locf() 但它没有做我想做的事情。提前致谢

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    这是使用dplyr 包的解决方案。

    library(dplyr)
    library(data.table)
    
    # Set the threshold
    threshold <- 4
    
    DT2 <- DT %>%
      mutate(Group_ID = cumsum(!is.na(Group))) %>%
      group_by(Group_ID) %>%
      mutate(ID = row_number() - 1) %>%
      mutate(Group = ifelse(ID <= threshold, first(Group), NA_character_)) %>%
      ungroup() %>%
      select(Group)
    DT2
    # # A tibble: 14 x 1
    #    Group
    #    <chr>
    #  1 SM   
    #  2 SM   
    #  3 SM   
    #  4 SM   
    #  5 SM   
    #  6 NA   
    #  7 GH   
    #  8 GH   
    #  9 GH   
    # 10 GH   
    # 11 GH   
    # 12 NA   
    # 13 NA   
    # 14 NA  
    

    【讨论】:

    • 非常感谢,这也有效。我今天学到了新东西:)
    【解决方案2】:

    data.table 的选项是

    library(data.table)
    DT[,  Group := Group[1][NA^(seq_len(.N) > 5)], cumsum(!is.na(Group))]
    DT
    #    Group
    # 1:    SM
    # 2:    SM
    # 3:    SM
    # 4:    SM
    # 5:    SM
    # 6:  <NA>
    # 7:    GH
    # 8:    GH
    # 9:    GH
    #10:    GH
    #11:    GH
    #12:  <NA>
    #13:  <NA>
    #14:  <NA>
    

    【讨论】:

      【解决方案3】:

      这是一种方法:

      > DT[, Group := ifelse(seq_len(.N) <= 1 + 4, Group[1], Group),by = cumsum(!is.na(Group))]
      > DT
          Group
       1:    SM
       2:    SM
       3:    SM
       4:    SM
       5:    SM
       6:  <NA>
       7:    GH
       8:    GH
       9:    GH
      10:    GH
      11:    GH
      12:  <NA>
      13:  <NA>
      14:  <NA>
      

      【讨论】:

      • 非常感谢,这真的很好,我学到了新东西。我在描述我想要的结果时犯了一个非常愚蠢的错误,但是在你的方法的帮助下,我能够在 shift() 的帮助下产生我想要的结果。再次,非常感谢。 :)
      猜你喜欢
      • 2018-03-28
      • 2021-05-28
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 2020-09-02
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      相关资源
      最近更新 更多