R用最后的非零值替换数据帧中的零

ada*_*888 5 replace r

我有一个包含零值的列的数据框:

a <- 1:10
b <- c(1, 0, 0, 0, 0, -1, -1, 0, 0, 1)
df <- data.frame(a, b)
df
Run Code Online (Sandbox Code Playgroud)

如何将零值替换为最后一个非零值,即列df $ b为:

 1,-1,-1,-1,-1,-1,-1,1,1,1
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助.

Ric*_*ven 8

这里有一个方法na.locfzoo.虽然这个方法确实NA在过程中改变了一些值,但代码很好而且无痛.

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
Run Code Online (Sandbox Code Playgroud)

对此的替代方案,可能比ifelse长向量更快的方法是

na.locf(with(df, { is.na(b) <- b == 0; b }), fromLast = TRUE)
# [1]  1 -1 -1 -1 -1 -1 -1  1  1  1
Run Code Online (Sandbox Code Playgroud)

  • 另一种变化:`na.locf(带(df,替换(b,b == 0,NA)),fromLast = TRUE) (2认同)