Home > Mobile >  Exchange NA with mean of previous and next value in R
Exchange NA with mean of previous and next value in R

Time:04-28

So I searched for an answer to how to exchange NAs with the mean of the previous and next values in a DataFrame for specifically one column. But I didn't find an answer which shows how to do this on base R with the addition that NAs can be next to each other.

the DataFrame:

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

whished output:

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

CodePudding user response:

In Base R you could do:

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

CodePudding user response:

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

Data:

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