将 NA 与上一个和下一个值的平均值交换

Exchange NA with mean of previous and next value

我搜索了如何将 NA 与 DataFrame 中特定一列的上一个和下一个值的平均值交换的答案。但是我没有找到一个答案来说明如何在 base R 上执行此操作以及 NA 可以彼此相邻。

DataFrame:

     name    number
1    John    56
2    Garry   NA
3    Carl    70
4    Doris   96
5    Wendy   NA
6    Louis   NA
7    Becky   40

希望输出:

     name    number
1    John    56
2    Garry   63
3    Carl    70
4    Doris   96
5    Wendy   68
6    Louis   68
7    Becky   40

在 Base R 中你可以这样做:

idx <- is.na(df$number)
df$number[idx] <- 0
b <- with(rle(df$number), rep(stats::filter(values, c(1,0,1)/2), lengths))
df$number[idx] <- b[idx]

df
   name number
1  John     56
2 Garry     63
3  Carl     70
4 Doris     96
5 Wendy     68
6 Louis     68
7 Becky     40
within(df1, number.fill <- 
                 rowMeans(cbind(ave(number, cumsum(!is.na(number)), 
                                    FUN=function(x) x[1]),
                                rev(ave(rev(number), cumsum(!is.na(rev(number))),
                                        FUN=function(x) x[1])))))
#>    name number number.fill
#> 1  John     56          56
#> 2 Garry     NA          63
#> 3  Carl     70          70
#> 4 Doris     96          96
#> 5 Wendy     NA          68
#> 6 Louis     NA          68
#> 7 Becky     40          40

数据:

read.table(text = "name    number
                   John    56
                   Garry   NA
                   Carl    70
                   Doris   96
                   Wendy   NA
                   Louis   NA
                   Becky   40", 
            header = T, stringsAsFactors = F) -> df1