Reputation: 7846
I have a dataframe with a column containing zero values:
a <- 1:10
b <- c(1, 0, 0, 0, 0, -1, -1, 0, 0, 1)
df <- data.frame(a, b)
df
How can I replace the zero values with the last non zero value ie column df$b to be:
1,-1,-1,-1,-1,-1,-1,1,1,1
Thank you for your help.
Upvotes: 5
Views: 2440
Reputation: 99331
Here's one way with na.locf
from zoo
. Although this method does change some values to NA
in the process, the code is nice and painless.
library(zoo)
na.locf(with(df, ifelse(b == 0, NA_real_, b)), fromLast = TRUE)
# [1] 1 -1 -1 -1 -1 -1 -1 1 1 1
An alternative to this, and one that might be faster than ifelse
on long vectors, is
na.locf(with(df, { is.na(b) <- b == 0; b }), fromLast = TRUE)
# [1] 1 -1 -1 -1 -1 -1 -1 1 1 1
Upvotes: 8