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