You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 19:19:59