R语言:保留非缺失值,用指定值循环填充向量缺失值的简洁实现
解决方案:循环填充向量缺失值并保留指定值
正确实现
可以利用取模运算实现简洁且通用的逻辑,核心是找到非缺失值在vals中的位置,再基于该位置为每个索引计算对应的填充值:
ticket_fill <- function(x, vals) { # 获取唯一非缺失值的位置与对应值 non_na_idx <- which(!is.na(x)) stopifnot(length(non_na_idx) == 1) # 确保输入仅含一个非缺失值 target_val <- x[non_na_idx] val_pos <- which(vals == target_val) # 计算每个位置对应的vals索引:基于非缺失值位置偏移+取模循环 seq_pos <- (seq_along(x) - non_na_idx + val_pos - 1) %% length(vals) + 1 vals[seq_pos] }
测试验证
1. 原始目标向量测试
x <- c(rep(NA, 5), "b", rep(NA, 2)) vals <- letters[1:3] ticket_fill(x, vals) # 输出结果:[1] "a" "b" "c" "a" "b" "b" "c" "a"
从第6位的"b"(对应vals的第2位)往前循环填充,往后延续循环逻辑,完全符合需求。
2. 短向量边界测试
x <- c(NA, "b") ticket_fill(x, letters[1:3]) # 输出结果:[1] "a" "b"
成功解决了原有代码在短向量场景下的错误问题。
逻辑解析
- 先定位唯一非缺失值的位置,以及它在
vals中的索引; - 通过
seq_along(x)生成每个元素的位置序号,计算其相对于非缺失值位置的偏移量; - 利用
%% length(vals)实现循环效果,最后加1转换为vals的有效索引(避免取模后出现0值)。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

