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

如何基于邻近值填充dataframe中的NA值(等距时取均值)

解决方案

可以通过结合前向填充、后向填充以及距离计算来实现需求,具体逻辑如下:

  • 先为每个位置记录前后最近的非NA值
  • 计算每个位置到前后非NA值的距离
  • 根据距离关系填充缺失值:距离前值更近则取前值,距离后值更近则取后值,距离相等则取两者均值

使用dplyr和tidyr实现的代码如下:

library(dplyr)
library(tidyr)

# 原始数据
data <- data.frame(x = c(2, 3, 3, NA, NA, 4, NA, 3, 2, NA, NA, NA, 4))

# 处理缺失值生成y列
data_processed <- data %>%
  mutate(
    # 前向填充:取前面最近的非NA值
    ffill = fill(x, .direction = "down")$x,
    # 后向填充:取后面最近的非NA值
    bfill = fill(x, .direction = "up")$x,
    # 计算到前一个非NA值的距离
    dist_ffill = ifelse(!is.na(x), 0, lag(dist_ffill, default = 0) + 1),
    # 计算到后一个非NA值的距离
    dist_bfill = ifelse(!is.na(x), 0, lead(dist_bfill, default = 0) + 1)
  ) %>%
  mutate(
    y = case_when(
      !is.na(x) ~ x,
      dist_ffill < dist_bfill ~ ffill,
      dist_ffill > dist_bfill ~ bfill,
      TRUE ~ (ffill + bfill) / 2
    )
  ) %>%
  select(x, y) # 保留需要的列

# 查看结果
print(data_processed)

运行后得到的结果与示例完全一致:

xy
22
33
33
NA3
NA4
44
NA3.5
33
22
NA2
NA3
NA4
44

内容的提问来源于stack exchange,提问作者Miquel Vallbona

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:56:09