如何用首个非零值填充滞后操作产生的空缺?
向量滞后操作后填充首个非零值到滞后区域的实现需求
我可以用以下方式对向量执行滞后操作,并保留/复制初始值1:
x <- c(1,0,0,0,0) zoo::na.locf(lag(x,1), fromLast = T) # 输出结果:[1] 1 1 0 0 0
但如果向量x以0开头,后续出现的1无法被复制到对应的滞后区域:
x <- c(0,1,0,0,0) zoo::na.locf(lag(x,1), fromLast = T) # 输出结果:[1] 0 0 1 0 0
我需要实现的是:当首个非零值不在向量开头时,将该值填充到其原始位置与滞后位置之间的空缺区域。期望得到的结果如下:
# 期望输出:0 1 1 0 0
简单来说,就是要用首个非零值填补它原始位置和滞后位置之间的空缺。以下是更复杂的示例:
原始向量:
c(0,0,0,1,2,3,0,0,0,0)
- 执行
lag 1操作后,期望结果:
c(0,0,0,1,1,2,3,0,0,0)
- 执行
lag 3操作后,期望结果:
c(0,0,0,1,1,1,1,2,3,0)
解决方案
我们可以自定义函数实现该逻辑,核心是对每个非零元素,向前填充指定滞后步数的区域,同时不覆盖已有的非零值:
fill_lag_gap <- function(x, lag_steps) { result <- x non_zero_idx <- which(x != 0) for (i in seq_along(non_zero_idx)) { current_idx <- non_zero_idx[i] prev_idx <- if (i > 1) non_zero_idx[i-1] else 0 actual_start <- prev_idx + 1 # 填充范围不超过当前索引,且起始位置不小于1 if (actual_start < current_idx) { fill_range <- actual_start:current_idx # 确保填充范围不超过滞后步数限制 fill_range <- fill_range[fill_range >= (current_idx - lag_steps)] result[fill_range] <- x[current_idx] } } return(result) } # 测试示例 x1 <- c(0,1,0,0,0) fill_lag_gap(x1, 1) # 输出:[1] 0 1 1 0 0 x2 <- c(0,0,0,1,2,3,0,0,0,0) fill_lag_gap(x2, 1) # 输出:[1] 0 0 0 1 1 2 3 0 0 0 fill_lag_gap(x2, 3) # 输出:[1] 0 0 0 1 1 1 1 2 3 0
该函数会根据指定的滞后步数,将每个非零元素向前填充到对应范围内,完全匹配需求。
内容的提问来源于stack exchange,提问作者Luitpold Wienerle
相关产品推荐
相关产品推荐

