【问题标题】:Replace NA values if last and next non-NA value are the same如果最后一个和下一个非 NA 值相同,则替换 NA 值
【发布时间】:2019-05-14 15:36:46
【问题描述】:

我正在尝试根据前一个和最后一个 NA 值是否相同来填充缺失的数据。例如,这是虚拟数据集:

df <- data.frame(ID = c(rep(1, 6), rep(2, 6), rep(3, 6), rep(4, 6), rep(5, 6), rep(6, 6), 
                    rep(7, 6), rep(8, 6), rep(9, 6), rep(10, 6)), 
             with_missing = c("a", "a", NA, NA, "a", "a", 
                              "a", "a", NA, "b", "b", "b", 
                              "a", NA, NA, NA, "c", "c", 
                              "b", NA, "a", "a", "a", "a", 
                              "a", NA, NA, NA, NA, "a", 
                              "a", "a", NA, "b", "a", "a", 
                              "a", "a", NA, NA, "a", "a", 
                              "a", "a", NA, "b", "b", "b", 
                              "a", NA, NA, NA, "c", "c", 
                              "b", NA, "a", "a", "a", "a"),
             desired_result = c("a", "a", "a", "a", "a", "a", 
                                "a", "a", NA, "b", "b", "b", 
                                "a", NA, NA, NA, "c", "c", 
                                "b", NA, "a", "a", "a", "a", 
                                "a", "a", "a", "a", "a", "a", 
                                "a", "b", "b", "b", "a", "a", 
                                "a", "a", "a", "a", "a", "a", 
                                "a", "a", NA, "b", "b", "b", 
                                "a", NA, NA, NA, "c", "c", 
                                "b", NA, "a", "a", "a", "a")) 

因此,例如,如果有四行的间隙,但间隙前后的值相同,那么我希望用相同的值填充间隙;而如果 NA 之前和之后的值不同,我不想填充它。另外,我需要按 ID 变量对数据进行分组。

我试过 na.locf 但我不知道如何添加“如果它们在 NA 之前和之后相同”的条件。

谢谢。

【问题讨论】:

    标签: r na missing-data


    【解决方案1】:

    您可以向前和向后填充,然后将它们不匹配的行设置为NA

    library(zoo)
    library(dplyr)
    
    df %>% 
      mutate_if(is.factor, as.character) %>% 
      group_by(ID) %>%
      mutate(result = na.locf(with_missing, fromLast = T),
             result = ifelse(result == na.locf(with_missing), result, NA))
    
    #    ID with_missing desired_result result
    # 1   1            a              a      a
    # 2   1            a              a      a
    # 3   1         <NA>              a      a
    # 4   1         <NA>              a      a
    # 5   1            a              a      a
    # 6   1            a              a      a
    # 7   2            a              a      a
    # 8   2            a              a      a
    # 9   2         <NA>           <NA>   <NA>
    # 10  2            b              b      b
    # 11  2            b              b      b
    # 12  2            b              b      b
    # 13  3            a              a      a
    # 14  3         <NA>           <NA>   <NA>
    # 15  3         <NA>           <NA>   <NA>
    # 16  3         <NA>           <NA>   <NA>
    # 17  3            c              c      c
    # 18  3            c              c      c
    # 19  4            b              b      b
    # 20  4         <NA>           <NA>   <NA>
    # 21  4            a              a      a
    # 22  4            a              a      a
    # 23  4            a              a      a
    # 24  4            a              a      a
    # 25  5            a              a      a
    # 26  5         <NA>              a      a
    # 27  5         <NA>              a      a
    # 28  5         <NA>              a      a
    # 29  5         <NA>              a      a
    # 30  5            a              a      a
    # 31  6            a              a      a
    # 32  6            a              b      a
    # 33  6         <NA>              b   <NA>
    # 34  6            b              b      b
    # 35  6            a              a      a
    # 36  6            a              a      a
    # 37  7            a              a      a
    # 38  7            a              a      a
    # 39  7         <NA>              a      a
    # 40  7         <NA>              a      a
    # 41  7            a              a      a
    # 42  7            a              a      a
    # 43  8            a              a      a
    # 44  8            a              a      a
    # 45  8         <NA>           <NA>   <NA>
    # 46  8            b              b      b
    # 47  8            b              b      b
    # 48  8            b              b      b
    # 49  9            a              a      a
    # 50  9         <NA>           <NA>   <NA>
    # 51  9         <NA>           <NA>   <NA>
    # 52  9         <NA>           <NA>   <NA>
    # 53  9            c              c      c
    # 54  9            c              c      c
    # 55 10            b              b      b
    # 56 10         <NA>           <NA>   <NA>
    # 57 10            a              a      a
    # 58 10            a              a      a
    # 59 10            a              a      a
    # 60 10            a              a      a
    

    【讨论】:

    • 这行得通,但它没有考虑每个 ID 应该单独完成的事实(即,当它们跨越两个或多个 ID 时不要填写 NA),我认为这是重要基于原始问题。也许先试试这一步? df_list &lt;- split(df, df$ID)
    • 谢谢,我没有注意到问题的那一部分。编辑以便分别为每个组完成计算。
    • 有一次我很高兴自己寻找解决方案,而不是自己解决。
    猜你喜欢
    • 1970-01-01
    • 2021-11-24
    • 2016-10-03
    • 2022-01-03
    • 1970-01-01
    • 2021-08-03
    • 2011-12-05
    相关资源
    最近更新 更多