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

R语言时间序列缺失值填充:前16天均值填x、前后16天最大值填y

R时间序列缺失值按自然日期窗口填充方案

原始数据集

d1<- structure(list(date = c("8/11/2020", "8/7/2020", "8/4/2020", 
"7/28/2020", "7/27/2020", "7/23/2020", "7/20/2020", "7/13/2020", 
"7/8/2020", "6/25/2020", "6/24/2020", "6/23/2020", "6/18/2020", 
"6/15/2020", "6/10/2020", "6/9/2020", "6/8/2020", "6/5/2020", 
"6/3/2020", "6/1/2020", "5/31/2020", "5/24/2020", "5/21/2020", 
"5/14/2020", "5/11/2020", "5/9/2020", "5/8/2020", "5/7/2020", 
"5/4/2020", "4/22/2020", "4/21/2020", "4/16/2020", "4/14/2020", 
"4/9/2020", "4/6/2020", "4/5/2020"), x = c(-3.444434096, -5.554643467, 
-5.819128168, -6.528574452, -6.528574452, -8.59555826, -3.025536602, 
-2.698376659, -3.483474963, -7.696235263, NA, -7.572170935, -7.185040842, 
-7.492766547, -3.728460293, -7.773342378, -7.773342378, NA, -6.601276462, 
NA, -6.315658227, -5.421106712, -5.421106712, -2.3212135, -3.40345796, 
-2.942817915, -2.942817915, NA, -1.858551108, -0.264005923, -0.264005923, 
0.192899359, -0.204841155, -0.107794142, -0.087664372, NA), y = c(-0.095663228, 
-2.228724135, NA, -1.287448285, -2.090320147, -2.090320147, 1.269873112, 
-2.64716097, -2.680828961, -2.335090584, -4.117893947, 0.375126608, 
0.375126608, NA, -3.939176552, NA, -1.797405353, -5.27192525, 
-5.27192525, -4.937367195, -4.885790778, -5.611024982, -5.215911023, 
-9.277147196, -9.277147196, -4.896429851, -7.053994787, 1.022381641, 
-1.398690039, 0.058918339, 0.058918339, -1.900802177, -1.253476157, 
1.283432302, 0.519769206, 0.519769206)), class = "data.frame", row.names = c(NA, 
-36L))

填充需求

  • 变量x的NA值按对应自然日期向前16天的所有非NA数值的均值填充,不按观测行顺序取前15条计算
  • 变量y的NA值按对应自然日期前后各7天范围内的所有非NA数值的最大值填充

实现代码

小数据量方案(tidyverse基础实现,无需额外安装其他包)

依赖dplyr和lubridate,先完成数据预处理:

library(dplyr)
library(lubridate)

# 把字符型日期转为Date格式,原日期是月/日/年格式
d1 <- d1 %>% mutate(date = mdy(date))

逐行计算窗口值填充缺失:

d1_filled <- d1 %>%
  rowwise() %>%
  mutate(
    # 填充x:取当前日期往前16天的x均值
    x = ifelse(
      is.na(x),
      mean(d1$x[d1$date >= date - days(16) & d1$date <= date], na.rm = TRUE),
      x
    ),
    # 填充y:取当前日期前后各7天的y最大值
    y = ifelse(
      is.na(y),
      max(d1$y[d1$date >= date - days(7) & d1$date <= date + days(7)], na.rm = TRUE),
      y
    )
  ) %>%
  ungroup()

大数据量优化方案(slider包实现,性能更高)

先安装依赖包:install.packages("slider")

library(slider)

d1_filled <- d1 %>%
  arrange(date) %>% # 先按日期升序排序
  mutate(
    # 滑动窗口计算x的前16天均值
    x = slide_index_dbl(
      .x = x,
      .i = date,
      .f = ~mean(.x, na.rm = TRUE),
      .before = days(16)
    ),
    # 滑动窗口计算y的前后7天最大值
    y = slide_index_dbl(
      .x = y,
      .i = date,
      .f = ~max(.x, na.rm = TRUE),
      .before = days(7),
      .after = days(7)
    )
  )

两种方案的计算结果完全一致,可根据数据规模选择使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 06:57:03