My question is I have a dataframe m as below 
y1 =c( rep("A",5),rep("B",5))
y2 = rep(c(1:5),2)
y3 = y2
y3[c(2,7,9)]=NA
m = data.frame(y1,y2,y3)
   y1 y2   y3
1   A  1    1
2   A  2 <NA>
3   A  3    3
4   A  4    4
5   A  5    5
6   B  1    1
7   B  2 <NA>
8   B  3    3
9   B  4 <NA>
10  B  5    5
I want to fill in the NA based on the closest non-NA value "in front of" this NA. My output should look like this:
   y1 y2   y3 y4
1   A  1    1  1
2   A  2 <NA>  1
3   A  3    3  3
4   A  4    4  4
5   A  5    5  5
6   B  1    1  1
7   B  2 <NA>  1
8   B  3    3  3
9   B  4 <NA>  3
10  B  5    5  5
Any idea about how to use dplyr to achieve this goal?
How to fill NA values with previous values in an R data frame column? How to fill NA values with previous values in an R data frame column? To fill NA values with next and previous values, we can use na.locf function of zoo package with fromLast = TRUE.
In R this is usually solved using the na.locf (Last Observation Carried Forward) function from the zoo package. See also here: Fill in NA based on the last non-NA value for each group in R. Using dplyr window-functions to make trailing values.
We can do that based on the zoo add-on package. Let’s install and load the package to RStudio: The zoo R package contains the na.locf function, which is a generic function for replacing each NA with the most recent non-NA value prior to it.
To fill NA values with next and previous values, we can use na.locf function of zoo package with fromLast = TRUE. This is the situation of a column as shown below −
This may have been answered before, but I don't know if it's been answered in a dplyr context.  zoo::na.locf() is your friend:
m %>% group_by(y1) %>% mutate(y4=zoo::na.locf(y3))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With